📚 网络安全 Kali 学习系列
模块 0 基础阶段 ✅ 已完成
01-18 Linux → 网络 → 密码学 → 编程 → Docker
模块 1 信息收集 ✅ 已完成 | 模块 2 Web渗透 ✅ 已完成
19-31 扫描 → 漏洞 → sqlmap → XSS → WAF绕过
模块 3 代码审计 ✅ 已完成
32-37 审计入门 → Node.js → PHP → Java → Python → CVE复现
模块 4 漏洞利用与后渗透 ✅ 已完成
38-43 Metasploit → Payload → 提权 → 维持 → 免杀
模块 4-2 逆向工程基础(进行中)
44 汇编基础与文件格式 ✓
45 静态分析工具:Ghidra 与 radare2(当前篇)
46 动态调试:GDB 与反调试
静态分析工具:Ghidra 与 radare2
网络安全 Kali 学习系列 · 第 45 篇 · 模块 4-2 逆向工程基础
读完本篇你将能:安装配置 Ghidra 12.0.4 和 radare2 6.2.2,使用 Ghidra 的反编译器将汇编代码还原为伪 C 代码,用 radare2 的命令行工具快速分析 PE/ELF 文件的函数列表、字符串和交叉引用,在 Kali 上对 /bin/ls 等系统工具完成一次完整的静态分析流程。
上一篇打下了汇编和文件格式的基础——寄存器、指令、PE/ELF 结构。本篇把这些知识用起来。逆向分析有两种主要路径:静态分析(不运行程序,通过工具观察代码)和动态调试(运行程序并监控行为)。静态分析是第一步——先"看清楚"程序的结构和逻辑,再决定是否需要动态调试。
目录
第一章 Ghidra 概述与安装配置
第二章 Ghidra 工作流:导入、分析与反编译
第三章 radare2 命令行快速分析
第四章 交叉引用与函数识别
第五章 实战:分析一个简单程序
第六章 分级练习
第一章 Ghidra 概述与安装配置
Ghidra 是美国国家安全局(NSA)于 2019 年开源的逆向工程框架,当前最新版本 12.0.4。与 IDA Pro 相比,Ghidra 完全免费、支持插件扩展、跨平台(Java 编写),是逆向分析的首选工具。
1.1 安装
Shell · Ghidra 安装
install_ghidra.sh
|
1
2
3
4
5
6
7
8
9
10
11
|
# Ghidra 依赖 JDK 21+
sudo apt update && sudo apt install -y default-jdk
java -version # 确认 JDK 版本
# 下载 Ghidra 12.0.4
wget https://github.com/.../ghidra_12.0.4_PUBLIC.zip
unzip ghidra_12.0.4_PUBLIC.zip -d /opt/
# 启动 Ghidra
/opt/ghidra_12.0.4_PUBLIC/ghidraRun
# GUI 窗口弹出,选择 File → New Project
|
1.2 Ghidra 核心组件
| 组件 |
功能 |
对应场景 |
| CodeBrowser |
主分析界面,汇编视图+伪C代码 |
日常逆向分析 |
| Decompiler |
将汇编自动还原为C伪代码 |
理解函数逻辑 |
| Function Graph |
函数调用关系图 |
理解程序整体架构 |
| Script Manager |
Python/Java 脚本扩展 |
批量自动化分析 |
第二章 Ghidra 工作流:导入、分析与反编译
Ghidra 的标准工作流分为四步:导入文件 → 自动分析 → 浏览函数 → 反编译阅读。本节以 /bin/ls 为例走通完整流程。
2.1 导入与分析
导入文件后,Ghidra 会提示选择分析选项。默认配置即可覆盖大部分场景——反汇编、函数识别、字符串搜索、类型推断全部勾选。点击 Analyze 后,Ghidra 会遍历整个二进制,识别函数边界、分析控制流、推断变量类型。
Ghidra · 分析选项
analysis.txt
|
1
2
3
4
5
6
7
8
9
10
|
# 分析选项(默认推荐勾选):
[x] Disassembly # 反汇编所有代码
[x] Function # 识别函数边界
[x] Symbols # 解析符号表
[x] References # 交叉引用分析
[x] Data Types # 类型推断
[x] Strings # 字符串搜索
# 大型二进制分析可能需要几分钟
# 分析完成后左侧 Symbol Tree 显示函数列表
|
2.2 反编译器阅读
双击 Symbol Tree 中的函数名,CodeBrowser 在右下角打开反编译窗口。Ghidra 的反编译器会尝试将汇编还原为可读的 C 伪代码——变量名可能是自动生成的(如 uVar1、puVar2),但控制流和数据流通常正确。
Ghidra · 快捷键
shortcuts.txt
|
1
2
3
4
5
6
7
8
|
# Ghidra CodeBrowser 常用快捷键
G # 跳转到指定地址
L # 重命名变量/函数(标记已知函数)
T # 修改变量类型
Ctrl+Shift+C # 复制反编译的C代码
Ctrl+F # 搜索
; # 添加注释
Esc # 回退到上一个查看位置
|
💡 小贴士
逆向分析最大的效率提升来自重命名——Ghidra 自动生成的函数名(FUN_00123456)和变量名(uVar1)毫无意义。一旦你通过交叉引用或字符串确认了某个函数的用途,立即按 L 重命名。积累十几个命名后,伪代码的可读性会质变。
第三章 radare2 命令行快速分析
radare2(简称 r2)是命令行逆向框架,当前版本 6.2.2。与 Ghidra 的 GUI 不同,r2 完全在终端操作——更快、更轻量,适合快速查看和自动化脚本。r2 的设计哲学是 Unix 式的:每个命令做一件事,通过管道组合。
3.1 基本命令
Shell · radare2 基本命令
r2_basic.sh
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 安装 radare2 6.2.2
git clone https://github.com/radareorg/radare2.git
cd radare2 && sys/install.sh
r2 -v # 确认版本 6.2.2
# 打开二进制文件
r2 /bin/ls
# r2 内部命令
i # 显示文件信息(格式、架构、位数)
ii # 列出导入表
iz # 列出字符串
afl # 列出所有函数
aaa # 自动分析(类似 Ghidra 的 Analyze)
pdf @main # 反汇编 main 函数
|
💡 小贴士
r2 的命令是一棵缩写树:i = info,ii = info imports,iz = info strings,ie = info exports。输入 ? 查看所有顶层命令,i? 查看 info 子命令。掌握缩写规律比死记命令更高效。
第四章 交叉引用与函数识别
交叉引用(Cross Reference,简称 xref)是逆向分析最重要的导航工具——它告诉你"谁调用了这个函数"和"这个函数被谁调用"。通过 xref 可以从已知函数追踪到未知函数,逐步建立程序调用链的全貌。
4.1 在 Ghidra 中使用 xref
在 CodeBrowser 中选中一个函数或变量,右键 → References → Show References to Address。Ghidra 会列出所有引用该地址的代码位置。也可以用快捷键 Ctrl+Shift+F 查看引用。
4.2 在 radare2 中使用 xref
Shell · r2 交叉引用
r2_xref.sh
|
1
2
3
4
5
6
7
8
9
10
11
|
# 先自动分析
aaa
# 查看某个地址的交叉引用
axt @ sym.imp.printf # 谁调用了 printf
# 查看某个函数调用了哪些函数
agC @ main # 生成调用图
# 列出所有字符串及其引用
iz~http # 搜索包含 http 的字符串
|
第五章 实战:分析一个简单程序
本节用一个练习程序串联 Ghidra 和 r2 的工作流。先写一个简单的 C 程序,编译后分别用两个工具分析。
5.1 编写并编译测试程序
Shell · 编译测试程序
build.sh
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// challenge.c
#include <stdio.h>
#include <string.h>
int check(char *input) {
return strcmp(input, "s3cr3t") == 0;
}
int main() {
char buf[64];
scanf("%63s", buf);
printf(check(buf) ? "OK\n" : "Fail\n");
}
|
Shell · 编译(去除符号表)
compile.sh
|
1
2
3
4
|
# 去除调试符号,模拟真实逆向场景
gcc -o challenge challenge.c -s
file challenge # ELF 64-bit, stripped
# 现在没有函数名信息,需要用工具还原
|
5.2 分析流程
编译后的 challenge 是 stripped ELF——没有函数名和调试信息。逆向分析的步骤是:(1) 用 strings challenge 找到 "s3cr3t"、"OK"、"Fail" 等关键字符串;(2) 在 Ghidra 或 r2 中搜索这些字符串的引用地址;(3) 通过 xref 找到使用这些字符串的函数;(4) 重命名函数并阅读反编译的伪 C 代码;(5) 确认程序逻辑——输入 "s3cr3t" 返回 OK。
Shell · r2 分析 challenge
analyze.sh
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 1. 搜索关键字符串
r2 -qc 'iz~s3cr3t' challenge
# 2. 自动分析并查看函数列表
r2 -qc 'aaa; afl' challenge
# 3. 查看字符串引用
r2 -qc 'aaa; axt @ str.s3cr3t' challenge
# 4. 反汇编引用该字符串的函数
r2 -qc 'aaa; axt @ str.s3cr3t; pdf' challenge
# 5. 查看 main 的伪 C 代码(pdc 命令)
r2 -qc 'aaa; pdc @ main' challenge
|
通过这个流程,你从零开始还原了一个 stripped 程序的逻辑——这正是恶意软件分析中"拿到样本→理解行为"的标准路径。区别只是恶意软件的代码更复杂、混淆更多。
第六章 分级练习
🟢 基础验证
任务:在 Kali 上安装 Ghidra 和 radare2,分别用它们分析 /bin/ls。(1) 记录 ls 的文件格式、入口点地址、节区数量;(2) 列出 ls 调用的前 5 个外部函数;(3) 搜索包含 "GNU" 的字符串,找到引用它的函数。
参考解法:r2 中 i 看格式,ii 看导入,iz~GNU 搜字符串,axt @ str.GNU 找引用。Ghidra 中用 Search → For Strings 搜字符串,双击后在反编译窗口看引用位置。
🟡 组合应用
任务:编写第五章的 challenge.c,编译为 stripped 版本,用 Ghidra 完成完整分析:(1) 导入文件并自动分析;(2) 搜索 "s3cr3t" 字符串并找到引用它的函数;(3) 重命名该函数为 check_secret(按 L 键);(4) 在反编译窗口阅读 check 和 main 的伪 C 代码;(5) 验证伪代码是否正确还原了程序逻辑。截取反编译窗口截图。
🔴 开放挑战
任务:找一个 Crackme(逆向练习题,可在 crackmes.one 获取),用 Ghidra 和 radare2 分析其验证逻辑,找出正确密码或序列号。要求:(1) 先用 strings 和 r2 的 iz 命令搜索可疑字符串;(2) 通过交叉引用追踪字符串的使用位置;(3) 在反编译窗口阅读验证函数的伪代码;(4) 分析算法逻辑,推导出正确输入;(5) 运行程序验证输入是否正确。写一份简短的分析报告,包含关键反汇编截图和推导过程。
参考方向:从简单 Crackme 开始(难度 1-2 星),常见验证方式包括字符串比较、简单算术运算、XOR 解密。逆向分析的核心技巧是"从已知推未知"——从字符串、API 调用等已知信息出发,通过交叉引用逐步扩展到未知函数。
💡 小贴士
Ghidra 和 r2 不是竞争关系而是互补关系。工作流建议:用 r2 快速查看文件信息、字符串、导入表(秒级响应);需要深入分析函数逻辑时切换到 Ghidra 的反编译器(伪 C 代码可读性更高)。r2 的 pdc 命令也有伪 C 输出,但质量略低于 Ghidra。
知识回顾
Ghidra 12.0.4
radare2 6.2.2
反编译器
伪 C 代码
交叉引用
函数识别
字符串搜索
CodeBrowser
r2 命令树
重命名标记
Crackme
下一篇预告
本篇解决了"怎么看"——用 Ghidra 和 r2 分析二进制文件的静态结构。下一篇解决"怎么跑":动态调试:GDB 与反调试识别。GDB 是 Linux 下最强大的调试器,可以在程序运行时设断点、查看寄存器和内存、单步执行。恶意软件经常使用反调试技术检测调试器存在,本篇将介绍常见的反调试手段和绕过方法。动态分析是静态分析的补充——当反编译器给出的伪代码不够清晰时,实际运行程序往往能揭示真实行为。
关注本公众号,持续获取网络安全 Kali 学习系列更新。如果觉得有帮助,欢迎点赞、在看、分享给同样在学习网络安全的朋友。