WorkBuddy + IDA MCP + Kali MCP 组合拳分析 PWN 题

本文最后更新于 2026年7月2日 晚上

WorkBuddy + IDA MCP + Kali MCP 组合拳分析 PWN 题

[TOC]

背景

最近遇到一道 CTF PWN 题,需要分析一个二进制文件 pwn(ELF x86-64)。传统的做法是用 IDA 在 Windows 上静态分析,写脚本爆 seed,然后传到 Kali 上验证和打远程。文件来回传、两边环境不一致导致 rand() 结果对不上等问题非常折磨。

这次尝试了 WorkBuddy + IDA MCP + Kali MCP 的组合工作流,全程在一个聊天窗口内完成,体验丝滑。

Step 1: IDA MCP 配置

IDA MCP (ida-pro-mcp) 是一个开源项目,让 AI 可以直接与 IDA Pro 交互——查询函数、反编译、搜索交叉引用等,无需手动操作 IDA。

安装:

1
2
# 使用 IDA 自带的 Python
D:\ida\IDA Professional 9.2\python311\python.exe -m pip install git+https://github.com/mrexodia/ida-pro-mcp

注册插件:

装好后插件自动注册到 C:\Users\<user>\AppData\Roaming\Hex-Rays\IDA Pro\plugins\ida_mcp.py。打开 IDA,Plugins > IDA MCP(小锤子图标),点”启动分析”,IDA 就在 http://127.0.0.1:13337/mcp 上提供 MCP 服务了。

WorkBuddy 配置(HTTP 模式):

1
2
3
4
5
6
7
8
{
"mcpServers": {
"ida-pro-mcp": {
"type": "http",
"url": "http://127.0.0.1:13337/mcp"
}
}
}

Step 2: 题目分析

IDA MCP 连接后,直接用 survey_binary 获取全局概览,然后用 decompile 反编译关键函数。

main 函数逻辑
1
2
3
4
5
6
init();
LLucky(); // R1: 检查 amaz 前缀是否为 "M!"
LLucky(); // R2: 检查 amaz 前缀是否为 "!K9"
LLucky(); // R3: 检查 amaz 前缀是否为 "MN4L"
LLucky(); // R4: 检查 amaz 前缀是否为 "n!$bG"
LLucky1(); // R5: 生成 amaz → gift() → system(amaz)

需要 5 轮输入 seed,前 4 轮生成指定前缀,最后一轮让 amaz == "/bin/sh" 即可 getshell。

R1-R4: LLucky 函数
1
2
3
4
5
6
7
strcpy(seeds, "n!$b/h*ACD1E9F@G2H3IJK4LMN5O&%PQ#6RS7TUV8WXYZ");
printf("Enter your seed: ");
scanf("%u", &seed);
srand(seed);
for (int i = 0; i < 7; i++)
amaz[i] = seeds[rand() % 30];
puts(amaz); // 打印 amaz

从 30 字符表中按 rand() % 30 取字符,共 7 个。

R5: LLucky1 函数
1
2
3
4
5
6
7
__int64 v2 = 0x0030682F6273696E;
printf("Enter your seed: ");
scanf("%u", &seed);
srand(seed);
for (int i = 0; i < 7; i++)
amaz[i] = *((_BYTE *)&v2 + rand() % 7);
gift(); // → system(amaz)

v2 的原始指令字节为 48 B8 6E 69 73 62 2F 68 30 00,小端序内存为:

1
n(0) i(1) s(2) b(3) /(4) h(5) 0(6)

MAGIC = "nisb/h0"

/bin/sh 对应的索引为 [4, 3, 1, 0, 4, 2, 5]

Step 3: 踩坑记录

第一次写爆破脚本时自定义实现了 glibc 的 rand()(TYPE_3 LFSR),但 warmup 阶段多做了 mod R 导致状态值始终为正,而实际 glibc 的 warmup 是纯 int32_t 加法溢出。

第二次写 C 版直接用系统 srand()/rand(),在 Windows 上写好后传给 Kali 编译。但跑出来的 seed 在 ./pwn 上验证不通过。

根本原因:MAGIC 字符串读错了。

IDA 反编译显示 v2 = 0x30682F6273696E4CLL;,但通过 xxd 检查实际指令字节为 48 B8 6E 69 73 62 2F 68 30 00。IDA 反编译多了一个 0x4C ('L') 字节,导致我误以为 MAGIC 是 "Lnis/bh0""nis/bh0",实际是 "nisb/h0"sb 前面)。

1
2
IDB 反编译显示: 0x30682F6273696E4C → L n i s / b h 0  (错的!)
实际指令字节: 6E 69 73 62 2F 68 30 00 → n i s b / h 0 (对的!)

Step 4: Kali MCP 配置

由于 ./pwn 运行在 Kali 虚拟机上,之前需要把脚本传到 Kali 再编译运行,效率很低。于是配置了 Kali MCP,让 WorkBuddy 可以直接在 Kali 上执行命令。

Kali 服务端:

1
2
3
git clone https://github.com/Wh0am123/MCP-Kali-Server.git
cd MCP-Kali-Server
python3 server.py --ip 0.0.0.0 --port 5000

WorkBuddy 配置:

1
2
3
4
5
6
7
8
9
10
{
"kali_mcp": {
"command": "C:\\Users\\czy\\.workbuddy\\binaries\\python\\versions\\3.13.12\\python.exe",
"args": [
"C:\\Users\\czy\\Desktop\\client.py",
"--server",
"http://192.168.32.131:5000"
]
}
}

配置完成后,WorkBuddy 可以直接通过 execute_command 工具在 Kali 上编译、运行、验证,一步到位。

Step 5: 最终 seed

通过在 Kali 上直接用系统 srand()/rand() + 正确的 MAGIC 和索引搜索,得到最终 seed:

轮次 Seed 生成的 amaz 状态
R1 1240 M!hN9MF
R2 11110 !K9M&DA
R3 930359 MN4LGnJ
R4 42726653 n!$bGG%
R5 332394 /bin/sh

Exploit 命令:

1
echo -e "1240\n11110\n930359\n42726653\n332394" | nc <HOST> <PORT>

进入 shell 后 cat flag 拿 flag。

总结

这次经验有几个收获:

  1. IDA MCP 极大提高了逆向效率——直接在对话中反编译、查函数,不用在 IDA GUI 里手动翻找
  2. 不要完全信任反编译器的输出——IDA 反编译显示的值和实际指令字节有差异,最终用 xxd 确认了真相
  3. Kali MCP 解决了跨平台问题——不用来回传文件、对齐环境,WorkBuddy 直接远程操作 Kali
  4. MAGIC 字符串的 sb 顺序非常容易看错——在 6E 69 73 62 2F 68 30 00 这串字节中,62b73s,顺序是 ...s b / h 0... 而不是 .../ b h 0...

WorkBuddy + IDA MCP + Kali MCP 的组合拳让整个分析、爆破、验证流程完全在聊天窗口内完成,从 IDA 分析到 getshell 全程无中断,非常爽。


WorkBuddy + IDA MCP + Kali MCP 组合拳分析 PWN 题
https://xyyr-c.github.io/2026/07/02/WorkBuddy-IDA-MCP-Kali-MCP-PWN/
作者
xyyr
发布于
2026年7月2日
许可协议