write-up/pwnable

[HackCTF] ROP

여니두 2019. 10. 5.

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

댓글