mcpField
A
analyzing-binaries

analyzing-binaries

github.com/trilwu安全17755 次安装12 周前更新
代码仓库

关于 analyzing-binaries

面向安全分析人员的二进制逆向技能,涵盖初步筛查、静态与动态分析及基于证据的调查,适用于研究未知程序、固件组件和闭源目标中的漏洞。

主要功能

  1. 01二进制初步筛查与格式识别
  2. 02使用反汇编器进行静态分析
  3. 03动态跟踪与调试
  4. 04固件分析与模拟流程
  5. 05识别并应对反分析技术

适用场景

  1. 01调查未知可执行文件
  2. 02还原协议或文件格式
  3. 03检查固件中的原生组件
  4. 04查找闭源二进制中的缺陷

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/trilwu/secskills --skill analyzing-binaries

安装后在 Claude Code 中输入/analyzing-binaries确认已加载。

详细介绍

分析二进制文件

逆向工程就是针对无法读取的程序进行假设检验。这项工作的成本主要取决于你要查看多少代码,因此整个过程都围绕着缩小范围展开:先做初步筛查,找出最值得关注的少数部分,再仔细阅读。

适用场景

  • 了解未知或缺少文档的可执行文件的功能
  • 从二进制文件中还原算法、文件格式或线路协议
  • 在闭源目标中定位漏洞
  • 分析嵌入式和 IoT 设备的固件
  • 解决 CTF 逆向题

不适用场景

  • 意图引爆的实时恶意软件——使用 analyzing-malware,其中介绍了隔离和安全引爆。需要反汇编时再回来使用本指南。
  • 没有文件头的原始 shellcode 二进制块(与位置无关的载荷、stager、egg-hunter)——使用 analyzing-shellcode
  • 有源代码——使用 auditing-code-for-vulnerabilities
  • 整体评估 Android/iOS 应用——使用 testing-mobile-applications;对于其中的原生 .so/Mach-O 组件,使用本指南
  • 框架运行时,而非普通二进制文件——工具链具有特异性,通用逆向工程无法胜任:对于 libapp.so/Dart 快照,使用 reversing-flutter-apps;对于 libil2cpp.so 和 global-metadata.dat,使用 reversing-unity-il2cpp;对于 Hermes 字节码,使用 reversing-react-native-apps
  • 具有自身符号还原机制的语言运行时——analyzing-go-binaries(剥离后仍会保留 pclntab)、analyzing-rust-binaries(panic 字符串会泄露源代码路径)、analyzing-dotnet-assemblies(IL 可反编译为 C#)。对这些目标使用通用逆向工程会浪费大部分精力
  • 经过加壳或保护的可执行文件——先使用 unpacking-protected-binaries;转储之前没有内容可供反汇编
  • 需要先提取整个固件映像才能开始逆向工程——使用 analyzing-firmware-images 运行 binwalk、提取文件系统并进行跨架构仿真;之后再回来分析其中的单个二进制文件

先做初步筛查——切勿一上来就打开反汇编器

在这里花的每一分钟,都能省下反编译时的一小时。

file target && du -h target
# Architecture, endianness, PIE, stripped or not — all decide your tooling
readelf -hSd target        # ELF: headers, sections, dynamic deps
rabin2 -I target           # radare2's normalized summary of any format
objdump -p target          # PE/ELF imports and load config

# Protections tell you what the author expected
checksec --file=target     # NX, canary, RELRO, PIE, Fortify

# Strings, but read them for structure rather than skimming
strings -n 8 -t x target | less        # ASCII with offsets
strings -e l -n 8 target               # UTF-16LE, essential on Windows

反汇编前,初步筛查应回答以下问题:

问题线索
这是用什么语言或工具链构建的?Rust/Go 运行时字符串、libstdc++、__gxx_personality、MSVC RTTI
文件是否加壳?高熵、导入表很小、节名称为 UPX、.themida
文件会与什么通信?导入 socket/HTTP API、嵌入的 URL、证书二进制块
有趣的逻辑在哪里?导入加密、文件、注册表、进程相关的 API
符号是否已剥离?nm -D 输出为空、没有 .symtab
# Entropy scan finds packed or embedded-blob regions
binwalk -E target
# Unpack the common case
upx -d target -o target.unpacked

Go 和 Rust 二进制文件通常不会以影响分析的方式剥离符号。开始其他工作之前,先还原符号——这能将数小时的工作缩短到几分钟。

# Go: recover function names and types
GoReSym -t -p target > syms.json    # or the redress / IDAGolangHelper plugins
# Rust: demangle
nm -C target 2>/dev/null | head

静态分析工作流

选定一种工具并深入使用;分析中途切换工具会导致注释丢失。

# Ghidra headless: batch import, auto-analyze, run a script
analyzeHeadless /proj MyProj -import target -postScript Decompile.java

# radare2 / rizin interactive
r2 -AA target
# aaa            analyze everything
# afl            list functions, sorted by size — big ones first
# axt @ sym.f    cross-references TO a function (who calls this?)
# pdg @ main     decompile with ghidra plugin (r2ghidra)
# iz / izz       strings in data / whole binary
# /x deadbeef    search for a byte pattern

# Binary Ninja / IDA headless equivalents exist; the workflow is identical

根据证据导航,而不是按地址顺序。 以下三个入口能最快找到有趣的代码:

  1. 字符串 → 交叉引用。 找到运行时看到的消息,通过交叉引用定位到生成该消息的函数。
  2. 导入项 → 交叉引用。 对 recv、CreateProcess、fopen、EVP_EncryptInit 执行交叉引用,找到执行你所关注操作的代码。
  3. 熵/常量。 加密常量(AES S 盒、SHA-2 轮常量、MD5 魔数)容易识别;binwalk、findcrypt 和 YARA 规则可用于定位。

然后从该锚点向外阅读。随着你弄清每个函数和变量的作用,为它们逐一重命名——经过注释的反编译清单与原始清单完全不同。

识别反编译输出中的结构

反编译器给出的是类似 C 代码的噪声。你需要寻找的是:

  • 带索引的字节数组循环,并执行 XOR — 可能是混淆或自制密码。提取密钥,在离线环境中解码。
  • 对输入读取的小整数执行 switch — 命令分发。这通常就是协议,也是理解其他一切的地图。
  • memcpy 的长度来自输入 — 内存安全审查的起点;参见 auditing-code-for-vulnerabilities。
  • 对同一基址反复访问 [rax + 8*n] — 这是一个结构体。在工具中定义它,反汇编列表就会变成可读代码。
  • 加载表后立即通过寄存器调用 — 虚函数表或回调分发。还原该表即可还原类。

动态分析

静态分析告诉你代码能做什么;动态分析告诉你代码实际做了什么。只在隔离的 VM 中运行不可信二进制文件,不要共享主机目录,并确保网络连接由你控制——隔离流程参见 analyzing-malware。

# Syscall and API-level behaviour
strace -f -e trace=network,file,process -o trace.log ./target
ltrace -f ./target
# Windows equivalents: API Monitor, Procmon, drltrace

# Debugging
gdb -q ./target       # with pwndbg/GEF: `checksec`, `vmmap`, `heap`, `telescope`
lldb ./target         # macOS
x64dbg / WinDbg       # Windows

# Instrumentation — the highest-leverage dynamic technique
frida-trace -f ./target -i 'recv*' -i 'EVP_*'
# then edit the generated JS handlers to dump buffers and patch return values

Frida 是绕过反调试、自定义加密和许可证检查的最快方法:在解密之后 hook 函数,而不是试图破解保护它的混淆。

仿真适用于固件和隔离的例程:

qemu-arm -L /usr/arm-linux-gnueabi ./target      # user-mode
# Unicorn for a single function: map memory, set registers, run, read result
# angr for symbolic execution when you need an input that reaches a state

固件

binwalk -Me firmware.bin        # extract recursively
# Identify the filesystem before extracting: squashfs, jffs2, cramfs, ubifs
unsquashfs -d rootfs squashfs-root.bin

# Then treat the rootfs as a Linux system
rg -n 'password|admin|BEGIN (RSA|OPENSSH) PRIVATE KEY|api[_-]?key' -i rootfs/
find rootfs -name '*.pem' -o -name 'shadow' -o -name '*.conf'
# Web interface and startup scripts are where the bugs are
ls rootfs/etc/init.d rootfs/www rootfs/usr/sbin

对于没有文件系统的引导加载程序或裸机映像,在反汇编之前先找到加载地址(通常可在供应商 SDK 中找到,或通过绝对指针聚类推导)。基址错误会让整个反汇编列表失去意义。

反分析

先识别它,再决定是破解还是绕过。

技术识别方法应对措施
加壳高熵,包含存根和一个大型节脱壳,或在 OEP 之后从内存中转储
反调试IsDebuggerPresent、ptrace(PTRACE_TRACEME)、计时检查修补检查,或用 Frida hook
VM 检测CPUID 检查、MAC OUI、注册表痕迹加固 VM,或修补检测器
字符串混淆没有可读字符串,但能明显看到解码循环对所有调用点仿真解码器
控制流扁平化围绕状态变量的大型 switch符号化去混淆,或忽略它并采用动态分析

绕过通常更省力。如果某项检查让你无法进行静态分析,就 hook 消耗其结果的函数。

应当摒弃的自我安慰

  • “我要读完整个二进制文件。” 你做不到。先分诊并找准切入点,否则你会把整个项目的时间都耗在库代码上。
  • “反编译器输出有误,所以这条路走不通。” 调用约定和结构体相关的反编译输出经常有误。得出结论前,先检查对应指令的反汇编。
  • “它经过了剥离,所以符号都没了。” 库函数可以恢复(FLIRT/Sigs、与编译后的参考文件进行 bindiff),Go/Rust 元数据通常也会保留。
  • “我直接运行看看它会做什么。” 在确认它是否有害以及运行环境如何隔离之前,不要这么做。
  • “字符串说明了一切。” 字符串告诉你该去哪里找。攻击者会植入误导性字符串。

交付内容

逆向工程报告应让读者无需重复你的工作就能采取行动:

  • 身份信息 — 哈希、文件类型、架构、编译器、加壳器
  • 能力 — 描述它的行为,而不是地址
  • 关键例程 — 带注释的地址、名称和一句话用途说明
  • 协议/格式 — 按字段说明;如有帮助,附上解析器或 Kaitai 规范
  • 指标 — 网络端点、文件路径、互斥体、密钥、常量
  • 未解决的问题 — 你尚未解决的问题及原因

ATT&CK 覆盖范围

根据 secskills-core/ttp-index.json 生成——请编辑该文件,然后运行 python3 scripts/sync_attack.py --write。在报告中引用这些 ID 前,请根据 当前 ATT&CK 版本重新核验。

防御规避(TA0005)

  • T1027 混淆文件或信息——另请参阅 analyzing-malware、analyzing-shellcode
  • T1027.002 软件加壳——另请参阅 analyzing-malware
  • T1140 反混淆/解码文件或信息——另请参阅 analyzing-malware、analyzing-shellcode
  • T1497 虚拟化/沙箱规避——另请参阅 analyzing-malware
  • T1622 调试器规避——另请参阅 analyzing-malware

针对上述任一项的检测内容:engineering-detections。主动搜索:hunting-threats。入侵后处置:responding-to-incidents。

参考资料

  • analyzing-malware——遏制、引爆分析和 IOC 提取
  • testing-mobile-applications——围绕原生组件的 APK/IPA 工作流
  • Ghidra、rizin/radare2、Binary Ninja、IDA——任选一种并深入学习
  • Frida、angr、Unicorn、QEMU,用于动态分析和模拟分析

评论

支持 Markdown