乐于分享
好东西不私藏

AI 驱动的逆向工程:用 tmux MCP 操控 GDB 与 Frida

AI 驱动的逆向工程:用 tmux MCP 操控 GDB 与 Frida

AI 驱动的逆向工程:用 tmux MCP 操控 GDB 与 Frida

让 AI 助手直接操控调试器,实现全自动化逆向分析。

背景

逆向工程的核心工作流是:启动调试器 → 设断点 → 运行 → 观察状态 → 推理逻辑。这个过程高度依赖交互式终端操作,传统上只能由人手动完成。

现在,通过 tmux MCP(Model Context Protocol)服务器,AI 助手可以直接操控终端中的 GDB、Frida 等交互式工具。AI 不再只是"建议你输入什么命令",而是自己动手调试、自己分析结果、自己定位答案。

本文通过两个示例展示这套工作流:

  1. 1. GDB 调试 x86-64 二进制 — 分析加密逻辑,提取 flag
  2. 2. Frida Hook Android 应用 — 动态拦截加密函数,直接解密

工具链安装

tmux + tmux MCP

# 安装 tmuxsudo apt install -y tmux    # Debian/Ubuntubrew install tmux            # macOS# 安装 tmux MCP 服务器npm install -g tmux-mcp

配置 Claude Code 连接 tmux MCP

claude mcp add tmux -- npx -y tmux-mcp

添加成功后会看到确认信息:

claude mcp add

通过 /mcp 命令可以验证连接状态: 

mcp connected

GDB 与 Frida

# GDBsudo apt install -y gdb# Frida(需要 Python 环境)pip install frida-tools

核心概念:rawMode 与 capture-pane

tmux MCP 提供以下关键工具:

工具
用途
create-session
创建 tmux 会话
split-pane
分割窗格(多窗格并行)
execute-command
在窗格中执行命令
capture-pane
捕获窗格当前输出

操控 GDB、Frida 这类交互式程序时,必须使用 rawMode: true。原因是这些程序启动后不会退出,普通模式会等待命令结束导致超时。rawMode 下发送命令后,通过 capture-pane 读取输出结果。

工作流程:

execute-command(rawMode: true) → 发送 gdb 命令        ↓capture-pane → 读取 gdb 输出        ↓AI 分析输出 → 决定下一步操作        ↓execute-command(rawMode: true) → 发送下一条命令

示例一:GDB 调试 x86-64 二进制程序

场景

一个 check_flag 程序,输入正确的 flag 才会输出 "Correct!"。程序使用了 AES 加密、MD5 哈希和 XOR 混淆。

AI 自动调试过程

只需一句话指令:

分析这个二进制程序,用 tmux 来调用 gdb 调试得到 flag
AI 启动 GDB 调试

AI 自动完成了以下步骤:

1. 创建 tmux 会话并启动 GDB

tmux create-session → gdb ./check_flag (rawMode: true)

2. 信息收集 — 反汇编 main 函数

AI 发现关键符号:aes_sboxmd5_shiftexpected_cipherxor_key.0enc.1,判断这是一个 XOR + MD5 + AES 的加密流程。

3. 查看静态数据

(gdb) x/s 0x20400x2040 <xor_key.0>: "WoRkTHi3"(gdb) x/32bx 0x20500x2050 <enc.1>: 0x25 0x0a 0x24 0x0e 0x26 0x3b 0x0c 0x6c ...

4. 设断点并运行

(gdb) b *main+1046    # AES 加密循环前(gdb) b *main+1749    # memcmp 调用处(gdb) runEnter flag: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

5. 提取关键数据

# XOR 解密结果(gdb) x/s $rsp+0x100"reverse_challenge_key_2024"# AES IV(gdb) x/16bx $rsp+0x500x10 0x32 0x54 0x76 0x98 0xba 0xdc 0xfe0x01 0x23 0x45 0x67 0x89 0xab 0xcd 0xef# memcmp 比较长度(gdb) info registers rdxrdx  0x30    # 48 字节

6. AI 自动编写解密脚本并验证

AI 根据调试结果推理出完整加密流程,编写 Python 解密脚本:

from Crypto.Cipher import AESimport hashlibkey_str = b'reverse_challenge_key_2024'md5_key = hashlib.md5(key_str).digest()iv = bytes([0x10,0x32,0x54,0x76,0x98,0xba,0xdc,0xfe,            0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef])expected_cipher = bytes([    0xb7,0x81,0x69,0x87,0xeb,0x02,0x46,0xef,    0x08,0x37,0x8f,0xce,0x38,0x87,0x80,0xcf,    0x31,0xeb,0x6c,0x1f,0xdb,0x5e,0xfd,0xd1,    0xf1,0xc9,0x15,0x59,0xa0,0x8e,0x11,0xec])cipher = AES.new(md5_key, AES.MODE_CBC, iv)decrypted = cipher.decrypt(expected_cipher)flag = decrypted[:-decrypted[-1]].decode()print(flag)  # flag{aes_md5_r3vers3_ez!}

AI 完成了从启动 GDB 到逐步分析加密逻辑、提取密钥、编写解密脚本的全过程:

AI 完成 GDB 调试全过程

程序加密流程

enc.1 XOR "WoRkTHi3" → "reverse_challenge_key_2024"                                │                              MD5                                ↓                        AES-128 密钥 (16 bytes)                                │用户输入 → AES-128-CBC(key, IV) → 密文 → memcmp(expected_cipher)

整个过程 AI 调用了约 7 次 tmux 工具,从启动 GDB 到拿到 flag,全程无需人工介入。

示例二:Frida Hook Android 应用

场景

同样的加密逻辑被移植到 Android 应用 com.example.checkflag。这次用 Frida 动态 hook,在运行时拦截加密函数并直接解密。

为什么需要 tmux

Frida 的工作模式决定了必须多窗格并行:

  • • Pane 1:Frida REPL(前台交互进程,持续输出 hook 日志)
  • • Pane 2:adb 命令(触发 app UI 交互)

单终端无法同时运行两者。tmux 解决了:

  1. 1. 多窗格并行操作
  2. 2. 会话持久化(SSH 断连不丢失 Frida 会话)
  3. 3. 实时观察 hook 输出

AI 自动 Hook 过程

指令:

你当前目录是一个 app,你先阅读源码,写 frida 脚本,用 tmux 运行 frida 来 hook 这个 app(adb 已经连接)来 getflag,不要直接静态分析。
AI Frida Hook 过程

AI 的操作流程:

1. 分析源码,理解加密逻辑

AI 先用 Explore agent 阅读 app 源码,理解了:

  • • buildMd5Source():XOR 解密得到 MD5 源数据
  • • md5Hash():生成 AES 密钥
  • • NativeAES.encrypt():JNI 层 AES-CBC 加密

2. 编写 Frida 脚本

Java.perform(function() {    var NativeAES = Java.use("com.example.checkflag.NativeAES");    var MainActivity = Java.use("com.example.checkflag.MainActivity");    // Hook buildMd5Source 获取 XOR 解密结果    MainActivity.buildMd5Source.implementation = function() {        var result = this.buildMd5Source();        console.log("[*] buildMd5Source: " + bytesToHex(result));        return result;    };    // Hook encrypt,拦截 key 和 IV,直接解密    NativeAES.encrypt.implementation = function(data, key, iv) {        console.log("[*] Key: " + bytesToHex(key));        console.log("[*] IV: " + bytesToHex(iv));        // 用 javax.crypto 在设备上直接解密        var SecretKeySpec = Java.use("javax.crypto.spec.SecretKeySpec");        var IvParameterSpec = Java.use("javax.crypto.spec.IvParameterSpec");        var Cipher = Java.use("javax.crypto.Cipher");        var keySpec = SecretKeySpec.$new(key, "AES");        var ivSpec = IvParameterSpec.$new(iv);        var cipher = Cipher.getInstance("AES/CBC/NoPadding");        cipher.init(2, keySpec, ivSpec);        var expectedBytes = Java.array('byte', EXPECTED_CIPHER);        var decrypted = cipher.doFinal(expectedBytes);        console.log("[*] Decrypted flag: " + bytesToAscii(decrypted));        return this.encrypt(data, key, iv);    };});

3. tmux 多窗格执行

┌─────────────────────────────────────────────┐│ Pane 1: Frida REPL                          ││ [Pixel 4::com.example.checkflag ]->         ││ [*] MD5 hash (AES key): 9086dc3e...         ││ [*] Decrypted flag: flag{aes_md5_r3vers3... │├─────────────────────────────────────────────┤│ Pane 2: adb 操作                             ││ $ adb shell input tap 540 1320              ││ $                                           │└─────────────────────────────────────────────┘

AI 通过 tmux MCP 的操作序列:

  1. 1. create-session — 创建会话
  2. 2. execute-command(rawMode: true) — 启动 Frida spawn 模式
  3. 3. split-pane — 分割出第二个窗格
  4. 4. execute-command — 在 Pane 2 执行 adb input 触发按钮
  5. 5. capture-pane — 读取 Pane 1 的 Frida 输出
AI 完成 Frida Hook 全过程

总结

tmux MCP 把 AI 从"建议者"变成了"操作者"。它不是替代逆向工程师的判断力,而是把重复性的调试操作自动化,让人可以专注在更高层的分析和决策上。

对于标准化的逆向任务(提取密钥、分析加密流程、hook 函数拦截参数),这套工作流已经可以做到端到端自动完成。