RTL은 Return-to-libc란 라이브러리를 반환한다는 뜻이며 NX bit(Non executable Stack) 스택상에서 코드 실행 불가능 일때 사용한다.

 

우리가 코드를 작성해서 실행 할때 사용되는 함수들은 모두 라이브러리에 들어있다.

RTL은 ret에 라이브러리 함수를 덮어 씌워 이것이 실행되도록 하는데 중점을 두고 있다.

 

RTL을 사용하기 위해서는 ret보다 높은 주소에 코드를 덮어 씌울 수 있어야 한다.

현재 상태의 스택이다.

함수 에필로그가 실행되면서 EBP는 원래 EBP로 이동하게 되고 ESP는 SFP를 가리키게 된다.

ret 명령어가 실행되며 pop eip가 실행된다.

여기서 ret에는 사전에 라이브러리에 있는 함수 주소를 넣어 두었다.

jmp eip를 통해 그대로 값이 불러진다. 이는 call명령으로 부르는게 아닌 그저 ret를 변조하여 함수를 호출한 것이기에 스택에 그대로 쌓이게 된다.(ret에 의한 함수 호출은 call과 다르게 return address 를 남기지 않는다.)

system함수가 실행되면서 esp는 SFP(함수)를 가리키게 된다.

 

중간 의미없는 것을 지나쳐 leave명령어에서 pop ebp로 ebp는 또 어딘가로 날아가고

esp는 더미 값을 가리키게 된다.

 

여기서 ret가 수행되면 esp는 SFP함수의 인자를 가리키게 되고 eip는 dummy를 가리키고 실행하게 된다.

여기서 RTL chaining이 발생할수 있다.

dummy값에 pop-ret 가젯을 넣는다면 '인자의 주소' 혹은 '인자의 값'을 건너뛰고 그뒤 4바이트를 다시금 ret로 참조하게 된다.

'Basic Concepts > System' 카테고리의 다른 글

GOT Overwrite  (0) 2020.04.24
PLT & GOT 정리  (0) 2020.04.24
Fake EBP  (0) 2020.04.22
SFPO(Stack Frame Pointer OverFlow)  (0) 2020.04.22
BOF(Buffer Over Flow)  (0) 2020.04.22

+ Recent posts