
REVERSE ENGINEERING — 把程序「拆开」看个明白
Reverse engineering, also called back engineering, is the process by which a man-made object is deconstructed to reveal its designs, architecture, or to extract knowledge from the object. —— from Wikipedia
软件代码逆向主要指对软件的结构、流程、算法、代码等进行逆向拆解和分析。主要应用于:
涉及 Windows、Linux、Android 平台的多种编程技术,要求利用常用工具对源代码及二进制文件进行逆向分析,掌握 Android 移动应用 APK 文件的逆向分析,掌握加解密、内核编程、算法、反调试和代码混淆技术。
strings / file / binwalk / IDA 等静态分析工具收集信息,并根据这些静态信息进行 google/github 搜索动态分析的目的在于定位关键代码后,在程序运行的过程中,借由输出信息(寄存器、内存变化、程序输出)来验证自己的推断或是理解程序功能。主要方法有:调试、符号执行、污点分析。
| 分类 | 工具 | 说明 |
|---|---|---|
| 静态分析 | IDA Pro | 逆向标配,F5 一键反编译伪代码 |
| 静态分析 | Ghidra | NSA 开源的免费 IDA 替代品 |
| 静态分析 | jadx / Dnspy | Android APK(Java)与 .NET 程序反编译 |
| 动态调试 | gdb | Linux 调试器,配合 pwndbg 插件更好用 |
| 动态调试 | x64dbg / OllyDbg | Windows 调试器 |
| 约束求解 | z3 | 微软约束求解器,逆向算法题神器 |
| 模拟执行 | angr | 符号执行框架,自动求解 |
入门只需要两样:IDA Pro(免费版 IDA Free 即可)+ 一个十六进制编辑器。先学会:打开文件 → 看函数列表 → 双击 main → F5 看伪代码。
IsDebuggerPresent 检测、SEH 异常处理、时间差检测、自调试等场景:下载附件(一个可执行文件),运行后让你输入 flag。附件在 BUUCTF 题目页「下载附件」按钮。
strings 附件 | grep flag,有时直接出答案。main → 双击进入 → 按 F5 反编译。flag{...})。// F5 伪代码(示意)
int main() {
if ( strcmp(input, "flag{This_Is_a_Easy_Re}") == 0 )
puts("right");
else
puts("wrong");
}
💡 Reverse 新手第一课:先 strings,再 IDA,最后才考虑动态调试。
场景:题目直接给你 open-source.c 源码文件 —— 逆向不一定要反汇编,读源码也是一种。
if (first != 0xcafe) { ... } // 参数1 必须等于 0xcafe = 51966
if (second % 5 == 3 || second % 17 != 8) { ... } // 参数2 满足 second%5==3 且 second%17==8
if (strcmp("h4cky0u", argv[3])) { ... } // 参数3 必须是 h4cky0u
unsigned int hash = first * 31337 + (second % 17) * 11 + strlen(argv[3]) - 1615810207;
printf("flag{%x}\n", hash); // 按表达式计算输出
8(8%5=3 ✓,8%17=8 ✓)。./open-source 51966 8 h4cky0u;② 用 Python 算(注意 32 位整型溢出取低 32 位):first, second, third = 0xcafe, 8, "h4cky0u"
h = first * 31337 + (second % 17) * 11 + len(third) - 1615810207
print("flag{%x}" % (h & 0xffffffff))
💡 学会「自己动手算」很重要:很多逆向题最终就是写一个脚本把算法逆回来。