二进制逆向工具设置
目的
确保所需的逆向工程工具可用且正确配置,以便进行跨架构分析。
何时使用
- 第一次分析会话前
- 当工具命令失败时
- 设置新的分析环境时
- 更新到较新的工具版本时
所需工具
| 工具 | 用途 | 优先级 |
|---|---|---|
| radare2 | 静态分析,反汇编 | 必需 |
| rabin2 | 快速二进制分类 | 必需(r2的一部分) |
| qemu-user | 跨架构仿真 | 必需 |
| gdb-multiarch | 跨架构调试 | 必需 |
| Ghidra | 反编译 | 推荐 |
| GEF | GDB增强 | 推荐 |
| Frida | 动态插桩 | 可选 |
| Unicorn | 代码片段仿真 | 可选 |
| Angr | 符号执行 | 可选 |
按平台安装
Ubuntu/Debian
# 核心工具
sudo apt update
sudo apt install -y \
radare2 \
qemu-user \
qemu-user-static \
gdb-multiarch \
binutils-multiarch \
jq # 技能命令中JSON解析必需
# ARM系统根(QEMU用)
sudo apt install -y \
libc6-armhf-cross \
libc6-arm64-cross \
libc6-dev-armhf-cross \
libc6-dev-arm64-cross
# 附加工具
sudo apt install -y \
file \
binutils \
elfutils \
patchelf
Windows (WSL2)
Windows用户应使用WSL2和Ubuntu以获得完整兼容性:
# PowerShell(管理员)- 安装WSL2和Ubuntu
wsl --install -d Ubuntu
# 提示重启计算机后,打开Ubuntu终端
WSL2 Ubuntu内部:
# 安装所有必需工具
sudo apt update && sudo apt install -y \
radare2 \
qemu-user \
qemu-user-static \
gdb-multiarch \
binutils-multiarch \
jq \
file \
patchelf
# 修复Windows挂载驱动器的文件权限
sudo tee -a /etc/wsl.conf > /dev/null << 'EOF'
[automount]
options = "metadata,umask=22,fmask=11"
EOF
# 重启WSL以应用更改
# (在PowerShell中:wsl --shutdown)
WSL2提示:
- 将二进制文件复制到
~而不是使用/mnt/c/...路径(权限问题较少) - 在PowerShell中使用
wsl --shutdown重启WSL配置更改后 - Docker Desktop与WSL2集成,用于基于容器的分析
macOS (Homebrew)
# 核心工具
brew install radare2 jq
# 注意:Homebrew QEMU可能缺少qemu-user目标
# 验证:qemu-arm --version || echo "qemu-user缺失"
# 如果缺失,使用Docker进行跨架构执行(见下文)
# GDB在macOS上需要特殊处理
brew install gdb
# 注意:调试需要代码签名
# ARM交叉工具(可选,仅用于静态分析)
brew install arm-linux-gnueabihf-binutils
macOS Docker设置动态分析
由于Homebrew不提供qemu-user,使用Docker进行跨架构执行:
# 安装Docker运行时(Colima是Docker Desktop的轻量级替代品)
brew install colima docker
# 启动Colima
colima start
# 注册多架构仿真处理器
docker run --rm --privileged --platform linux/arm64 \
tonistiigi/binfmt --install arm
# 验证ARM32仿真工作
docker run --rm --platform linux/arm/v7 arm32v7/debian:bullseye-slim uname -m
# 应输出:armv7l
# 验证ARM64仿真工作
docker run --rm --platform linux/arm64 arm64v8/debian:bullseye-slim uname -m
# 应输出:aarch64
# 验证x86-32仿真工作
docker run --rm --platform linux/i386 i386/debian:bullseye-slim uname -m
# 应输出:i686
# 验证
重要: 在Colima上,始终从~/挂载而不是/tmp/:
# ✅ 有效
docker run -v ~/samples:/work ...
# ❌ 可能静默失败
docker run -v /tmp/samples:/work ...
Arch Linux
sudo pacman -S radare2 qemu-user gdb
yay -S arm-linux-gnueabihf-glibc # 来自AUR
工具特定设置
radare2
# 验证安装
r2 -v
rabin2 -v
# 安装r2ghidra插件(反编译)
r2pm init
r2pm update
r2pm -ci r2ghidra # -ci = 清洁安装
# 验证r2ghidra是否工作(关键检查)
r2 -qc 'pdg?' - 2>/dev/null | grep -q Usage && echo "r2ghidra OK" || echo "r2ghidra缺失"
# 替代验证
r2 -c 'Ld' /bin/ls | grep -i ghidra
常见r2ghidra问题:
| 症状 | 原因 | 修复 |
|---|---|---|
pdg未知命令 |
插件未加载 | r2pm -ci r2ghidra |
| 插件加载但崩溃 | 版本不匹配 | 更新r2和插件 |
| 反编译挂起 | 大函数 | 使用pdf代替,或Ghidra无头 |
配置(~/.radare2rc):
# 禁用脚本颜色
e scr.color=false
# 增加分析限制
e anal.timeout=120
e anal.maxsize=67108864
# 默认JSON输出脚本
e cfg.json.num=true
Ghidra(无头)
# 从https://ghidra-sre.org/下载
# 解压到/opt/ghidra
# 验证无头脚本
/opt/ghidra/support/analyzeHeadless --help
# 添加到PATH
echo 'export PATH=$PATH:/opt/ghidra/support' >> ~/.bashrc
内存配置(大二进制文件):
编辑/opt/ghidra/support/analyzeHeadless:
MAXMEM=4G # 从默认增加
GEF(GDB增强功能)
# 安装GEF
bash -c "$(curl -fsSL https://gef.blah.cat/sh)"
# 验证
gdb -q -ex "gef help" -ex "quit"
# 对ARM Cortex-M支持,也安装gef-extras
git clone https://github.com/hugsy/gef-extras.git ~/.gef-extras
echo 'source ~/.gef-extras/scripts/checksec.py' >> ~/.gdbinit
Frida
# 安装Frida工具
pip install frida-tools
# 验证
frida --version
# 安装设备调试的frida-server(可选)
# 从https://github.com/frida/frida/releases下载
Unicorn(Python绑定)
pip install unicorn
# 验证
python -c "from unicorn import *; print('OK')"
Angr
# 创建虚拟环境(推荐)
python -m venv ~/angr-venv
source ~/angr-venv/bin/activate
# 安装angr
pip install angr
# 验证
python -c "import angr; print('OK')"
YARA
# Ubuntu/Debian
sudo apt install yara
# 或从源代码获取最新版本
git clone https://github.com/VirusTotal/yara.git
cd yara
./bootstrap.sh
./configure
make && sudo make install
# Python绑定
pip install yara-python
系统根设置
标准Debian/Ubuntu系统根
已通过libc6-*-cross包安装:
# 验证路径
ls /usr/arm-linux-gnueabihf/lib/
ls /usr/aarch64-linux-gnu/lib/
从设备自定义系统根
# 通过SSH从设备拉取
mkdir -p ~/sysroots/device
ssh user@device "tar czf - /lib /usr/lib" | tar xzf - -C ~/sysroots/device
# 或最小提取
ssh user@device "tar czf - /lib/ld-* /lib/libc.* /lib/libpthread.* /lib/libdl.*" \
| tar xzf - -C ~/sysroots/device
Musl系统根
# 来自Alpine Linux
docker run -it --rm -v ~/sysroots:/out alpine:latest sh -c \
"apk add musl musl-dev && cp -a /lib /usr /out/alpine-musl"
验证脚本
运行此脚本来验证所有工具是否正常工作:
#!/bin/bash
set -e
echo "=== 二进制RE工具验证 ==="
# radare2
echo -n "radare2: "
r2 -v | head -1
# rabin2
echo -n "rabin2: "
rabin2 -v | head -1
# QEMU
echo -n "qemu-arm: "
qemu-arm --version | head -1
echo -n "qemu-aarch64: "
qemu-aarch64 --version | head -1
# GDB
echo -n "gdb-multiarch: "
gdb-multiarch --version | head -1
# Ghidra(可选)
if command -v analyzeHeadless &> /dev/null; then
echo -n "Ghidra: "
analyzeHeadless 2>&1 | head -1 || echo "可用"
else
echo "Ghidra: 未安装(可选)"
fi
# Frida(可选)
if command -v frida &> /dev/null; then
echo -n "Frida: "
frida --version
else
echo "Frida: 未安装(可选)"
fi
# 系统根
echo ""
echo "=== 系统根 ==="
[ -d /usr/arm-linux-gnueabihf ] && echo "ARM硬浮点:OK" || echo "ARM硬浮点:缺失"
[ -d /usr/aarch64-linux-gnu ] && echo "ARM64:OK" || echo "ARM64:缺失"
echo ""
echo "=== 验证完成 ==="
故障排除
常见问题快速参考
| 症状 | 原因 | 修复 |
|---|---|---|
Docker中的exec format error |
binfmt未注册 | docker run --privileged tonistiigi/binfmt --install arm |
ld-linux.so.3未找到 |
链接器路径不匹配 | ln -sf /lib/ld-linux-armhf.so.3 /lib/ld-linux.so.3 |
libXXX.so未找到 |
缺少依赖 | 容器中apt install(检查rabin2 -l) |
r2 pdg未知命令 |
r2ghidra未安装 | r2pm -ci r2ghidra |
axtj的空xrefs |
浅层分析 | 使用aa; aac或手动af @addr |
| Docker挂载为空 | Colima//tmp问题 | 使用~/path而不是/tmp/path |
| 容器中strace失败 | ptrace未实现 | 使用LD_DEBUG=files,libs |
r2 “无法打开文件”
# 检查权限
ls -la binary
# 尝试使用显式格式
r2 -b 32 binary
QEMU “无效的ELF图像”
# 验证架构匹配
file binary
# 检查QEMU变体
qemu-arm --help | grep -i "target"
Docker “exec format error”
# 注册binfmt处理器(一次性设置)
docker run --rm --privileged --platform linux/arm64 \
tonistiigi/binfmt --install arm
# 验证注册
cat /proc/sys/fs/binfmt_misc/qemu-arm
GDB “无法执行二进制文件”
# 使用QEMU作为gdbserver
qemu-arm -g 1234 ./binary &
gdb-multiarch -ex "target remote :1234" ./binary
Ghidra “内存不足”
# 在analyzeHeadless脚本中增加堆
# 或明确传递:
analyzeHeadless ... -max-cpu 4 -analysisTimeoutPerFile 600
QEMU中缺少ARM库
# 在QEMU环境中设置LD_LIBRARY_PATH
qemu-arm -E LD_LIBRARY_PATH=/lib:/usr/lib -L /sysroot ./binary
# 或使用patchelf修改二进制文件的rpath
patchelf --set-rpath /lib:/usr/lib ./binary
Docker容器找不到库
# 容器内,安装常见依赖
apt-get update && apt-get install -y libcap2 libacl1
# 检查二进制文件需要什么
# (在主机上运行rabin2 -l之前进入容器)
版本建议
| 工具 | 最低 | 推荐 |
|---|---|---|
| radare2 | 5.8.0 | 最新 |
| QEMU | 7.0 | 8.0+ |
| GDB | 12.0 | 14.0+ |
| Ghidra | 10.3 | 11.0+ |
| Frida | 16.0 | 最新 |
环境变量
添加到~/.bashrc或~/.zshrc:
# Ghidra
export GHIDRA_HOME=/opt/ghidra
export PATH=$PATH:$GHIDRA_HOME/support
# QEMU的默认系统根
export QEMU_LD_PREFIX=/usr/arm-linux-gnueabihf
# Angr虚拟环境
alias angr-activate='source ~/angr-venv/bin/activate'