본문 바로가기

정보보안/개념

RTL 이란?

RTL(Return To Library)

실행파일에 링크된 libc의 함수를 PLT, GOT에서 가져와서 호출하여 사용하는 것

PLT와 GOT에서 함수들의 주소를 가져온다.

 

RTL을 처음 접할 수 있는 것은 FTZ level19번 문제였다.

https://b1ackhand.tistory.com/138

 

[FTZ]level19

코드가 매우 짧은걸 볼 수 있다. 너무 짧아서 무엇이 부족한지 몰랐다. 평소대로 환경변수를 이용하여 buffer overflow를 이용하여 풀렸지만 다른 사람들의 풀이를 읽어보고 무엇이 부족한지 알 수

b1ackhand.tistory.com

 

 

다음과 같이 system 이나 setreuid 함수가 프로그램 내에서 존재하는 주소를 알아낼 수 있다.

이를 사용하여

메모리를 다음과 같이 설정해주면

system()함수의 인자로써는 [ebp+8]에서 가져오고 ret 할때 dummy를 pop한다.

 

하지만, ftz19번같이 함수를 여러개 사용하고 싶은 경우에는 RTL체인 기법을 이용해야 한다.

위 문제를 해결하기 위해 같은 방식으로 페이로드를 짠다고 한다면

 

payload : buffer + stack frame pointer + setreuid() + system() + A + B

setreuid()에서 반환된후 system()을 실행하기 위해 바로 뒤에온다. 하지만 system() 인자로써 원하는 인자를 사용하지 못한다. 이를 해결하기 위해서는 gadget이라는 개념을 사용해야한다.

 

gadget은 함수의 인자들은 정리할때 pop ret; 을 사용하는데 이를 프로그램 내부에서 가져오는 것이다.

pop은 인자의 개수만큼 필요하다.

ex) setreuid(3000,3000) => 2개 필요

 

payload : buffer + stack frame pointer + setreuid() + gadget + A + B + system() + dummy + /bin/bash

이 같은 경우 gadget에 도달하는 순간 pop pop ret; 이 동작하면서 system() 까지 이어지게 된다.

 

이를 응용하여 ROP(Return Oriented Programming)을 사용할 수 있다.

 

방어법

- DEX / NXBit : 메모리의 영역에서 실행을 막는 방어법