RTL ( Return To Libc )
- 해당 기법을 이용하여 NX bit ( DEP ) 메모리 보호기법을 우회할 수 있다.
- 공격방식은 Buf + SFP + system + dummy(exit) + /bin/sh로 RET를 원하는 함수로 덮어 실행한다.
NX bit ( MS : DEP ) : NX (Never eXecute bit, 실행 방지 비트 ) 란 ,
- 프로세스 명령어나 코드 또는 데이터 저장을 위한 메모리 영역을 따로 분리하는 CPU의 기술이다.
NX bit를 적용함으로써 얻을수있는 방어적 이점 :
- 예를들어 , 공격자가 Return To Shellcode 기법등을 사용하기 위해서는 Heap , Stack 영역에 Shellcode를 저장해서 실행하기 위해서는
해당 영역에 대한 실행권한을 가지고 있어야 한다.
- 만일 DEP가 적용되지 않았을 경우 , 쉘코드가 얹어진 Heap , Stack 영역에 대한 실행 권한을 가지므로 쉘코드의 실행에 전혀 문제 되지 않는다.
하지만 , DEP가 적용된 경우 , 실행권한이 없으므로 쉘코드가 실행되지 않고 프로그램에서 해당 동작에 대한 예외처리 후 프로세스가 종료된다.
NX bit ( DEP ) 에 대해서는 다른 글에서 보다 자세히 다뤄보기로 하고 여기서는 이러한 방어기법이 존재한다 라는 정도만 인지 후 넘어간다.
RTL 기법은 이러한 DEP 메모리 보호기법을 bypass할 수 있는 기법이다.
RTL 기법을 이해하기 이전에 Calling Convention ( 호출 규약 ) 에 대하여 잠시 알아보자.
CDECL ( C declaration )
- 해당 호출 규약 ( Calling Convention )은 Intel x86 기반 시스템의 C / C++ 에서 주로 사용되어진다.
- 기본적으로 , Linux Kernel 에서는 Cdecl 호출규약을 사용한다.
- 함수의 인자 값을 Stack에 저장하며 , 오른쪽에서 왼쪽 순서로 스택에 저장한다.
- 함수의 Return 값은 EAX ( x86 ) 레지스터에 저장된다.
- 사용된 Stack 정리는 해당 함수를 호출한 함수가 정리한다.
cdecl 함수 호출 규악을 확인하기 위한 간단한 코드를 확인해보자.
해당 소스를 해당 컴파일 옵션을 통하여 컴파일 후 gdb 를 통하여 cdecl 함수 호출 규약 형태를 확인해보자.
gdb를 통하여 디버깅모드에 들어간 후 , test 함수를 부르는곳에 bp를 걸고 stack에 저장된 vuln() 함수의 인자 값을 확인한다.
이제 RTL을 확실히 이해해보자.
예제 소스다.
gcc -m32 -fno-stack-protector -o rtl rtl.c -ldl
위와 같이 BreakPoint를 설정한다.
vuln+0 : vuln() 첫 Instruction
vuln+121 : read() 호출 부분
vuln+139 : vuln() RET Instruction
다음과 같이 Return address를 확인할 수 있다.
- ESP 레지스터가 가리키고 있는 Stack 최상위 주소는 0xffffcf7c이다.
- 해당 영역은 Return address ( 0x5655659 ) 가 저장되어 있다.
이제 buf 변수의 시작주소를 확인한다.
buf와 Return address 사이값을 구한 다음 다음과 같이 payload를 작성한다.
payload : dummy + &system + &exit + &"/bin/sh"
system함수 다음 4byte 값의 더미값으로 exit 주소를 주었다.
system 함수 뒤에 4byte의 더미를 주는 이유는 다음과 같다.
- system 함수는 ebp+8에 위치한 값을 인자로 인식한다. 때문에 exit함수나 4byte이 dummy값을 준다.
'Hacking & Security > Exploit' 카테고리의 다른 글
diff 32bit vs 64bit (0) | 2019.11.20 |
---|---|
Return to Shellcode (0) | 2018.12.27 |
Basic of pwnable (0) | 2018.12.27 |
BOF 기초문서 (0) | 2018.11.03 |