티스토리 뷰

포너블/포너블 공부

RTL에 대하여

삼전동해커 2021. 1. 11. 13:01

RTL이란 Return To Libc 라는 기법으로 libc에 들어있는 함수를 불러와 실행시키는 방법이다.

PLT와 GOT에 대해 알아야 하는데 


https://watchout31337.tistory.com/152

여기서 알아보자.


rtl은 libc에 있는 함수의 주소를 이용해서 실행중인 코드에 존재하지 않는 함수를 사용할 수 있다.

이 방법으로 스택이나 힙에서 쉘 코드 실행을 막아주는 dep을 우회할 수 있다. 쉘 코드를 실행할 필요 없이 함수 자체를 불러오는 방법으로.



이런 간단하지만 취약점이 있는 코드를 보자.

strcpy함수로 argv[1]을 buf로 복사했다.

하지만 길이를 체크하지 않기 때문에 취약점이 발생한다. buf의 크기인 128을 넘어 sfp와 ret를 조작할 수 있다.



이렇게 실행하면 



이렇게 나온다.


gdb로 열어 확인해 보면



main+57에서 ebp-8c가 buf의 위치이다. 그럼 12만큼의 더미가 있다는 의미이다.


buf[128]+dummy[12]+sfp[4]+ret[4] 이렇게 생겼다.


rtl을 이용해 ret를 조작해보자.


rtl의 모양을 보면


system함수의 주소[4]+dummy[4]+인자[4]


이런 모양이다.

중간의 dummy는 system함수의 ret라고 생각하면 된다.

rtl을 여러개 묶어 사용할 때, 즉 여러 함수를 사용할 때 dummy대신 다른 함수의 주소를 넣으면 된다.


그럼 system("ls")이런 함수를 실행해보도록 하자.


system 주소를 찾는 방법은 실행중인 프로그램에서 

p system을 사용하면 된다.


이렇게 주소가 0xf7e3dd0이 출력된다.

이 주소는 고정된 주소가 아니다. libc base주소가 계속 변하기 때문에 offset을 구해 진짜 위치를 찾아야 한다.


system함수의 주소는 위에서 구한대로 이고,

인자 ls를 넣어야 한다.


'포너블 > 포너블 공부' 카테고리의 다른 글

[dreamhack] SSP_000  (0) 2021.01.22
SSP(canary)  (0) 2021.01.18
ROP에 대해  (0) 2021.01.02
pwntools 이용하기  (0) 2020.12.01
PLT(Procedure Linkage Table),GOT(Global Offset Table)  (0) 2020.09.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함