写在前面在上一篇博客中我们成功在 Windows 上搭建了 WSL2 Ubuntu 的环境并配置了 GDB 和 pwndbg。但在真正开始找漏洞、写 Exploit 之前我们首先要学会“观察”目标程序。本文将记录我学习四个 Linux 下必备的二进制分析工具的过程file、checksec、readelf和objdump。它们是 PWN 和逆向工程的基础侦察兵。 目录准备测试样本file识别文件类型checksec安全防护机制探雷器readelf解析 ELF 文件结构objdump反汇编与节区查看总结1. 准备测试样本为了方便演示我们先写一个简单的存在漏洞的 C 程序并编译它。在终端中执行nano vuln.c输入以下代码#include stdio.h #include string.h void secret() { printf(You hacked me!\n); } void vulnerable() { char buf[64]; printf(Please input: ); gets(buf); // 危险函数存在栈溢出 } int main() { vulnerable(); return 0; }编译命令注意关闭某些保护机制以供后续实验gcc -m64 vuln.c -o vuln -no-pie -fno-stack-protector -z execstack-m64编译为 64 位程序。-no-pie关闭地址随机化。-fno-stack-protector关闭栈溢出保护。-z execstack使栈可执行。现在我们得到了一个名为vuln的可执行文件接下来的操作都将基于它进行。2.file识别文件类型拿到一个二进制文件第一步通常是看它到底是什么。file命令通过读取文件的魔数来判断文件类型。执行命令file vuln预期输出vuln: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, missing section headers at 9096输出解析ELF 64-bit这是一个 64 位的 ELF (Executable and Linkable Format) 文件。LSBLittle Endian小端序Intel/AMD 架构通常是小端序。executable这是一个可执行文件如果是共享库则会显示shared object。x86-64指令集架构为 x86-64。dynamically linked动态链接依赖 libc 等动态库。如果是静态链接则会显示statically linked。3.checksec安全防护机制探雷器checksec是 PWN 选手最常用的工具之一用于检查二进制文件开启了哪些安全保护机制。这直接决定了我们后续需要采用何种攻击手法。如果安装了pwntools或pwndbg系统里通常已经有了checksec命令。执行命令checksec vuln预期输出不同版本显示略有差异RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE Partial RELRO No canary found NX disabled No PIE (0x400000) No RPATH No RUNPATH 54) Symbols No 0 2 vuln核心机制解析重点RELRO (Relocation Read-Only)Partial RELRO部分 RELRO。GOT 表仍然可写容易遭到 GOT 表劫持攻击。Full RELRO完全 RELRO。GOT 表只读无法进行 GOT 表覆写。STACK CANARY (栈金丝雀)No canary found没开栈保护。可以进行简单的栈溢出覆盖返回地址。Canary found开了栈保护。函数返回前会检查栈顶的特定值如果被覆盖会触发stack smashing detected从而终止程序。NX (No-eXecute) / DEPNX disabled栈可执行。可以直接往栈里写 shellcode 并跳过去执行我们刚编译时加了-z execstack。NX enabled栈不可执行。不能直接执行栈上的 shellcode通常需要 ROP 技术。PIE (Position Independent Executable)No PIE程序加载基址固定如 0x400000。程序内部的函数、变量地址在每次运行时都不变。PIE enabled地址随机化。每次运行程序基址都会变需要信息泄露来绕过。4.readelf解析 ELF 文件结构readelf用于读取 ELF 文件的各个部分信息。ELF 文件包含文件头、程序头表、节头表等。4.1 查看文件头readelf -h vuln这里会显示 Magic 魔数、入口地址、程序头表和节头表的偏移量等关键信息。4.2 查看节头表“节”包含了链接时需要的信息比如代码段、数据段、字符串表等。readelf -S vuln你可以看到诸如.text存放代码、.data已初始化全局变量、.bss未初始化全局变量、.got全局偏移表、.plt程序链接表等节区。4.3 查看符号表在找关键函数地址时非常有用。readelf -s vuln | grep secret通过这条命令我们可以查看到secret函数的地址。因为关闭了 PIE这个地址是固定的。(输出示例5: 0000000000401196 21 FUNC GLOBAL DEFAULT 1 secret说明secret函数地址为0x401196)4.4 查看程序头表“段”主要用于告诉操作系统如何加载程序到内存。readelf -l vuln5.objdump反汇编与节区查看objdump是一个强大的反汇编工具可以将机器码转换成汇编代码。5.1 反汇编代码段如果你想看程序的汇编代码使用-d参数objdump -d vuln这会打印出所有函数的汇编代码。5.2 查看特定函数通常我们只关心特定的函数比如main或vulnerable可以结合grep使用objdump -d vuln -M intel | grep -A 20 vulnerable-M intel指定使用 Intel 语法显示汇编默认是 ATT 语法Intel 语法对新手更友好。grep -A 20显示匹配行及之后的 20 行。5.3 查看字符串有时候程序里硬编码了一些重要字符串如/bin/sh或提示信息可以用-s参数查看特定节区objdump -s -j .rodata vuln-s显示节区的完整内容。-j .rodata指定只看.rodata只读数据段节区。6. 总结在 Week1 的这下半部分我掌握了 Linux 下二进制分析的四大神器file看透文件基本属性架构、位数、链接方式。checksec摸清敌人的防御装甲Canary、NX、PIE等这是制定攻击策略的前提。readelf解剖 ELF 文件的内部结构符号表找函数地址节头表看布局。objdump将黑盒的机器码反汇编成人类可读的汇编语言分析程序逻辑。实战思路串联拿到一个程序 - 用file看看它是什么 - 用checksec看看它有什么保护 - 用objdump或readelf找到危险函数如gets和后门函数如secret的地址 - 准备用 GDB 动态调试并编写 Exploit本篇文章对您有帮助请点赞收藏支持一下感谢阅读