보안/시스템 해킹

[ 시스템 해킹 ] Exploit Tech: Return Oriented Programming

haena02 2022. 8. 11. 03:43
반응형

스택의 반환 주소를 덮는 공격은 스택 카나리, NX, ASLR이 도입되며 점점 어려워졌다.

공격 기법은 셸 코드의 실행에서 라이브러리 함수의 실행으로, 그리고 다수의 리턴 가젯을 연결해서 사용하는 Return Oriented Programming(ROP)로 발전하였다.

 

NX의 도입으로 셸 코드를 사용할 수 없게 된 것은 공격자에게 큰 제약이 되었다.

그래서 지난 코스 Return to Library에서 살펴본 것과 같이 pop rdi; ret같은 코드 가젯과 라이브러리의 system 함수를 사용하는 공격 기법이 새롭게 등장하였다.

 

현실적으로, ASLR이 걸린 환경에서 system 함수를 사용하려면 프로세스에서 libc가 매핑된 주소를 찾고, 그 주소로부터 system 함수의 오프셋을 이용하여 함수의 주소를 계산해야 한다.

ROP는 이런 복잡한 제약 사항을 유연하게 해결할 수 있는 수단을 제공한ㄷ.

 

 

1. ROP

ROP는 리턴 가젯을 사용하여 복잡한 실행 흐름을 구현하는 기법이다.

공격자는 이를 이용해서 문제 상황에 맞춰 return to library, return to dl-resolve, GOT overwrite 등의 페이로드를 구성할 수 있다. 

ROP 페이로드는 리턴 가젯으로 구성되는데, ret 단위로 여러 코드가 연쇄적으로 실행되는 모습에서 ROP chain이라고도 불린다.

 

 

// Name: rop.c
// Compile: gcc -o rop rop.c -fno-PIE -no-pie

#include <stdio.h>
#include <unistd.h>

int main() {

  char buf[0x30];
  setvbuf(stdin, 0, _IONBF, 0);
  setvbuf(stdout, 0, _IONBF, 0);
  
  // Leak canary
  puts("[1] Leak Canary");
  printf("Buf: ");
  read(0, buf, 0x100);
  printf("Buf: %s\n", buf);
  
  // Do ROP
  puts("[2] Input ROP payload");
  printf("Buf: ");
  read(0, buf, 0x100);
  return 0;
  
}

코드를 보니 버퍼 배열로 카나리를 읽어내면 될 것 같다.

반응형