[HackCTF] ROP
32bit ELF 파일.
실행해보면, 입력을 받으면 Hello World를 출력한다.
일단 함수 목록을 보면, vulnerable_function이 눈에 띈다.
이 함수를 보면 read() 함수로 buf에 256byte 입력받는다.
buf의 크기는 88h(=136byte)로 입력받는 값보다 작다. 따라서 여기서 BOF가 일어난다.
buf[136] |
SFP[4] |
RET[4] |
★ ROP을 위해 필요한 준비물
1. gadget
write() 함수를 이용한 후 read() 함수를 사용할 것이기 때문에 POP POP POP RET gadget이 필요하다.
write() 함수의 인자는 세 개이기 때문이다.
>> 0x8048509
2. ROP에 사용될 함수의 plt, got, offset
1) write() offset
>> 000d43c0
2) read() offset
>> 000d4350
3) system() offset
>> 0003a940
4) plt
gdb에서 p 명령어로 쉽게 찾기 가능
5) got
got는 GOT Overwrite 하기 위해 필요하다.
3. "/bin/sh"
BSS 영역에 저장할 것이다. BSS 영역은 주소가 고정적이기 때문이다.
>> .bss: 0x804a024
★ 페이로드
1. RET을 write() 함수로 덮어서 read@got을 넣는다. (read 함수의 실제 주소)
2. BSS 영역에 "/bin/sh"을 입력할 수 있도록 read() 함수를 호출한다.
+ 인자는 입력을 위해 0, bss 영역 주소, "/bin/sh\x00"의 길이를 넣어준 후 "/bin/sh\x00" 입력.
3. GOT Overwrite. read 함수의 실제 주소에서 구한 read offset을 빼면 libc base 주소를 얻을 수 있음.
-> libc base 주소 + system offset 주소 = system 함수의 실제 주소
read() 함수를 더 호출하여 인자로 0, read@got 주소, 주소 길이를 준다
>> read@got를 system 함수의 주소로 덮어씌우기
4. read() 함수를 다시 호출하면 GOT Overwrite가 진행되었기 때문에 read가 아닌 system()이 호출됨.
인자로는 BSS 영역 주소를 주면 된다.
'write-up > pwnable' 카테고리의 다른 글
[HackCTF] RTL_World (0) | 2019.10.05 |
---|---|
[HackCTF] x64 Buffer Overflow (0) | 2019.10.04 |
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2019.10.04 |
[HackCTF] Basic_FSB (0) | 2019.10.04 |
[HackCTF] Basic_BOF #2 (0) | 2019.10.04 |
댓글