📍 【基础概念 1-5】 | 逆向工程系列课程
逆向工程(Reverse Engineering)是指通过对已有的软件、硬件或系统进行分析,推导出其设计思路、内部结构和工作原理的过程。在软件领域,逆向工程通常指从编译后的二进制可执行文件中还原出程序的逻辑、算法和数据结构。这是信息安全领域最核心的技能之一,广泛应用于漏洞挖掘、恶意软件分析、CTF竞赛和安全审计。
| 年代 | 事件 | 意义 |
|---|---|---|
| 1960s | 早期汇编语言分析 | 程序员需要理解机器码,手工反汇编 |
| 1975 | 第一个反汇编器诞生 | 自动化反汇编的起点 |
| 1985 | Borland Turbo Debugger发布 | 首款商用调试器,DOS时代标配 |
| 1991 | IDA Pro首次发布 | 最强大的反汇编工具诞生,至今仍是行业标准 |
| 1997 | SoftICE成为经典调试工具 | Ring0级内核调试,Windows逆向的黄金时代 |
| 2000s | OllyDbg发布 | Windows逆向标配工具,免费且强大 |
| 2010 | Radare2项目启动 | 开源命令行逆向框架 |
| 2012 | Frida发布 | 动态插桩革命,跨平台运行时Hook |
| 2019 | Ghidra开源 | NSA开源逆向框架,免费反编译器 |
| 2020s | AI辅助逆向 | 大语言模型开始辅助代码理解和漏洞发现 |
不运行程序,通过阅读二进制代码、反汇编结果来理解程序逻辑。静态分析可以覆盖程序的所有执行路径,不受运行时条件限制。
代表工具:IDA Pro、Ghidra、Binary Ninja、Radare2
优点:覆盖全面、可分析任意路径、安全(不执行恶意代码)
缺点:难以处理动态行为(反射、JIT)、混淆代码增加分析难度
适用场景:恶意软件初步分析、协议格式推断、漏洞代码审计
在受控环境中运行程序,观察其运行时行为和状态变化。动态分析可以看到程序真实的执行路径和数据流。
代表工具:GDB、x64dbg、Frida、strace/ltrace、Wireshark
优点:直观、可观察运行时行为、自动处理混淆
缺点:只能覆盖执行到的路径、可能被反调试检测
适用场景:协议逆向、恶意软件行为分析、Crackme破解
| 类别 | 工具 | 用途 | 平台 |
|---|---|---|---|
| 反汇编 | objdump、IDA Pro、Ghidra | 将机器码转为汇编 | 跨平台 |
| 调试器 | GDB、x64dbg、WinDbg | 运行时断点调试 | Linux/Windows |
| 十六进制编辑 | hexdump、xxd、HxD | 查看原始二进制数据 | 跨平台 |
| 二进制分析 | readelf、file、strings | ELF/PE文件结构分析 | Linux |
| 动态插桩 | Frida、Pin、DynamoRIO | 运行时函数Hook | 跨平台 |
| Android逆向 | jadx、apktool、Frida | APK反编译与调试 | Android |
| 网络分析 | Wireshark、mitmproxy | 协议逆向分析 | 跨平台 |
| Fuzzing | AFL++、libFuzzer、honggfuzz | 自动化漏洞挖掘 | Linux |
| 符号执行 | angr、KLEE、S2E | 自动化路径探索 | 跨平台 |
| 二进制对比 | BinDiff、Diaphora | 补丁对比分析 | 跨平台 |
# 检查操作系统版本
$ uname -a
Linux VM-4-3-ubuntu 6.8.0-101-generic # x86_64 GNU/Linux
# 检查CPU架构
$ lscpu | head -5
Architecture: x86_64
CPU(s): 4
Thread(s) per core: 1
Vendor ID: AuthenticAMD
# 检查内存
$ free -h | head -2
total used free
Mem: 3.8Gi 1.2Gi 2.0Gi
# 安装基础二进制分析工具
$ apt-get update && apt-get install -y binutils gdb strace ltrace file
✅ 验证通过:binutils包含objdump/readelf/strings等核心工具
# 验证各工具安装
$ objdump --version | head -1
GNU objdump (GNU Binutils) 2.38
$ gdb --version | head -1
GNU gdb (GDB) 12.1
$ readelf --version | head -1
readelf (GNU Binutils) 2.38
$ strace --version | head -1
strace -- version 6.3
$ file --version | head -1
file-5.44
✅ 验证通过:所有核心工具安装成功
# file命令:识别文件类型(逆向第一步)
$ file /bin/ls
/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
for GNU/Linux 3.2.0, stripped
✅ 验证通过:file命令成功识别ELF文件格式和架构信息
# strings命令:提取可读字符串(信息收集利器)
$ strings /bin/ls | head -30
/lib64/ld-linux-x86-64.so.2
libc.so.6
puts
strlen
malloc
realloc
free
__libc_start_main
GLIBC_2.2.5
GLIBC_2.34
...
✅ 验证通过:strings提取出动态链接库和函数名
# 搜索特定功能线索
$ strings /bin/ls | grep -i "usage\|help\|version\|error"
Usage: %s [OPTION]... [FILE]...
--version output version information and exit
Try '%s --help' for more information.
✅ 验证通过:从字符串快速了解程序功能
# readelf:查看ELF头信息(深入分析)
$ readelf -h /bin/ls
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
Type: DYN (Position-Independent Executable)
Machine: Advanced Micro Devices X86-64
Entry point address: 0x6a10
Start of program headers: 64 (bytes into file)
Start of section headers: 143648 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 13
Size of section headers: 64 (bytes)
Number of section headers: 31
Section header string table index: 30
✅ 验证通过:readelf成功解析ELF头部信息
# objdump:反汇编入口点
$ objdump -d /bin/ls | head -30
/bin/ls: file format elf64-x86-64
Disassembly of section .init:
0000000000003a90 <.init>:
3a90: f3 0f 1e fa endbr64
3a94: 48 83 ec 08 sub $0x8,%rsp
3a98: 48 8b 05 f9 7d 01 00 mov 0x17df9(%rip),%rax
...
✅ 验证通过:objdump成功反汇编ELF二进制
ELF(Executable and Linkable Format)是Linux/Unix系统下的标准可执行文件格式。每个ELF文件由四个部分组成:
ELF文件有两种视图:链接视图(Section Headers)和执行视图(Program Headers)。运行时只使用执行视图,链接时才需要链接视图。
Unstripped:保留了符号表(.symtab)和调试信息,函数名、变量名可见,逆向相对容易
Stripped:移除了符号表,只能看到地址和偏移量,逆向难度大幅增加。大部分发布版本的二进制都是stripped的。
# 对比stripped和unstripped
$ file /bin/ls
/bin/ls: ... stripped
$ file /usr/bin/ls.coreutils # 未strip的版本(如果存在)
/usr/bin/ls.coreutils: ... not stripped
# 对比符号表
$ nm /bin/ls 2>&1 | head -3
nm: /bin/ls: no symbols
$ nm /usr/bin/ls.coreutils 2>/dev/null | head -5
0000000000003a90 T _init
0000000000003b00 T _start
0000000000003f40 T main
...
✅ 验证通过:stripped版本无符号信息,not stripped版本有完整符号表
逆向工程在某些司法管辖区可能受法律限制。请务必了解并遵守当地法律:
file命令分析/bin/cat、/bin/grep、/usr/bin/python3的文件类型,记录它们的架构和链接方式strings提取/bin/ls中包含"usage"的字符串,推断程序功能readelf -h比较3个不同ELF文件的头部差异,理解各字段含义objdump -d查看/bin/ls的反汇编代码,尝试识别函数调用模式恭喜完成第一课!你已经建立了逆向工程的基础认知,并掌握了第一批工具。在接下来的课程中,我们将深入学习汇编语言、文件格式和分析技术。
理解逆向概念 掌握file/strings/readelf 完成首个二进制分析 了解ELF基础结构 法律伦理意识