ii4gsp

RTL (Return-to-libc) 기법 본문

시스템 해킹/Technique

RTL (Return-to-libc) 기법

ii4gsp 2020. 1. 22. 13:07

RTL (Return-To-Libc)

Return To Library 줄여서 RTL 기법이라고 한다.

쉘 코드없이 쉘을 실행할 수 있다.

메모리에 미리 적재되어 있는 공유 라이브러리 함수의 주소 RET에 덮어씌어 현재 코드에 사용되지 않는 함수를 실행 시킬 수 있다.

RTL기법을 사용하는 대표적인 이유는 NX bit 방어기법을 우회하기 위해 사용한다.

 

NX bit

NX bit는 공격자가 스택, 힙, 데이터 영역에서의 공격코드를 실행하지 못하게 한다.

 

 

 

 

예제

argv[1][47]가 "\xbf"이면 프로그램을 종료를 시킨다.

ret 변조시 bf로 시작하지 않는 주소로 변조시킬 수가 없기때문에 스택으로 주소를 변조하는 것은 불가능하다.

RET를 공유 라이브러리 주소로 변조시켜 함수 내부 RET를 쉘을 실행시키는 주소로 바꿔주면 된다.

 

공유 라이브러리 함수로는 system() 함수를 많이 사용한다.

system()함수는 내부적으로 execve()함수를 사용하는데 execve()함수의 동작은

"/bin/sh"를 통해서 하기때문에 system()함수 내부의 "/bin/sh"의 주소도 알아야한다.

그럼 이제 system()함수의 주소와 "/bin/sh"의 주소를 찾아주자

 

 

 

 

gdb로 파일을 열고 print system명령으로 system()함수의 주소를 구할 수 있다.

system()함수의 주소는 0x40058ae0이다.

 

 

 

 

"/bin/sh"를 찾는 소스코드이다.

system변수에 아까 찾은 system()함수의 주소를 넣고 memcmp()함수로 system()함수 내부에 있는"/bin/sh"의 주소를 찾는다.

컴파일하고 실행을 해주자

 

 

 

 

"/bin/sh"의 주소는 0x400fbff9이다.

이제 payload를 작성할 수 있다.

buffer [40byte] + SFP[4byte] + system() 주소 [4byte] + dummy [4byte] + "/bin/sh"주소 [4byte]

system()함수의 주소를 넣고 dummy를 넣어주는 이유는 system()함수의 RET를 채우고 system()함수의 인자로 EBP+8의 위치에 "/bin/sh"를 넣어주기 위함이다.

 

 

 

 

쉘이 실행되었다.

'시스템 해킹 > Technique' 카테고리의 다른 글

Find kernel32.dll Address  (0) 2020.04.08
GOT Overwrite 기법  (0) 2020.01.22
FPO (Frame Pointer Overflow) 기법  (0) 2020.01.21
[Heap] Double Free Bug  (0) 2020.01.20
[Heap] Use After Free  (0) 2020.01.20
Comments