文章总结: 本文档是PWN入门笔记,系统介绍了Linux下二进制分析的基础命令。详细讲解了checksec查看保护机制、gdb动态调试、ROPgadget查找ROP链及file分析二进制文件的具体用法,并涵盖了IDA查看字符串与堆栈的基础操作,适合初学者掌握核心分析流程。 综合评分: 85 文章分类: 二进制安全,CTF,逆向分析,安全工具,漏洞分析
PWN入门笔记-命令篇
原创
tlnshuju
绿洲安全
2026年1月5日 08:30 北京
免责声明:由于传播、利用本公众号绿洲安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号绿洲安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢! 文章作者:博客园(tlnshuju) 参考来源:https://www.cnblogs.com/tlnshuju/p/19094173 本文建议电脑观看,表格适配差点意思。
一、Linux常用指令
1. 基础文件操作
这些命令用于浏览、查看和管理文件,是分析题目附件的基础。
| 命令 | 功能说明 | 示例或备注 |
| — | — | — |
| ls | 列出目录内容 | ls -la显示详细文件信息(包括隐藏文件) |
| cd | 切换当前工作目录 | cd /tmp |
| cat | 查看文件内容 | 常用于直接读取flag:cat flag或 cat /home/ctf/flag.txt |
| find | 查找文件 | find / -name "pwn" 2>/dev/null在根目录下查找名为 “pwn” 的文件(忽略错误信息) |
| grep | 在文件中搜索特定字符串 | grep -r "flag{" ./在当前目录递归搜索包含 “flag{” 的文件 strings binary \| grep "bin/sh"在二进制文件中查找字符串 |
| file | 查看文件类型 | file pwn_binary判断文件是 ELF32 还是 ELF64,以及是否 stripped |
| objdump | 反汇编二进制文件 | objdump -d ./pwn_binary \| grep "system"反汇编并查找 system 函数地址 |
| readelf | 显示 ELF 文件信息 | readelf -s ./pwn_binary查看符号表 readelf -h ./pwn_binary查看文件头 |
| chmod | 修改文件权限 | 常用来给二进制文件添加可执行权限:chmod +x pwn_binary |
| cp/ mv/ rm | 复制 / 移动 / 删除文件 | |
| touch | 创建空文件 | |
| mkdir | 创建目录 | |
2. 网络连接
与远程靶机交互、传输数据或测试网络。
| 命令 | 功能说明 | 示例或备注 |
| — | — | — |
| nc(netcat) | 连接远程靶机或开启端口监听 | nc 127.0.0.1 9999连接本地 9999 端口 nc -lvp 1234在本机 1234 端口开启监听 |
| ping | 检查网络连通性 | ping example.com |
| ifconfig/ ip | 查看和配置网络接口信息 | ifconfig或 ip addr |
| wget/ curl | 下载文件 | wget http://example.com/pwn_binary下载文件 |
3. 进程与系统信息
查看系统状态、进程信息和管理进程。
| 命令 | 功能说明 | 示例或备注 |
| — | — | — |
| ps | 显示当前进程状态 | ps aux或 ps -ef查看所有进程信息 ps aux \| grep pwn查找包含 pwn 的进程 |
| top/ htop | 动态显示进程状态和系统资源使用情况 | |
| kill | 终止进程 | kill -9 1234强制终止 PID 为 1234 的进程 |
| uname | 打印系统信息 | uname -a查看内核版本等信息 |
| env | 查看环境变量 | |
| set | 显示 shell 变量和环境变量 | |
| export | 设置环境变量 | export LD_LIBRARY_PATH=./libs设置动态链接库路径 |
4. 权限管理
在权限提升或需要特定权限操作时使用。
| 命令 | 功能说明 | 示例或备注 |
| — | — | — |
| sudo | 以 root 权限执行命令 | sudo -l列出当前用户可执行的 sudo 命令 |
| su | 切换用户身份 | su root切换至 root 用户(需要密码) |
| chown | 改变文件所有者 | chown user:group file |
| chgrp | 改变文件所属组 | |
5. Pwn 专用工具
这些是二进制漏洞利用的核心工具,并非系统内置命令,但通常需要在 Linux 环境下安装和使用。
| 命令 | 功能说明 | 示例或备注 |
| — | — | — |
| checksec | 检查二进制文件的安全保护机制(如 NX, PIE, Canary, RELRO) | checksec pwn_binary |
| gdb | GNU 调试器,用于动态调试 | gdb ./pwn_binary 常用插件:pwndbg, gef, peda |
| objdump | 反汇编二进制文件 | objdump -d ./pwn_binary反汇编代码段 |
| readelf | 显示 ELF 文件信息 | readelf -s ./pwn_binary查看符号表 |
| ROPgadget | 自动查找二进制文件中的 ROP gadget | ROPgadget --binary pwn_binary |
| python3 | 运行 exploit 脚本 | python3 exp.py |
| pwntools | Python 的 Pwn 工具库(在 Python 脚本中 from pwn import *) | |
| strace | 跟踪系统调用 | strace ./pwn_binary查看程序执行时的系统调用 |
| ltrace | 跟踪库函数调用 | ltrace ./pwn_binary查看程序调用的库函数 |
| file | 用于识别文件类型的工具 | file example.txt |
| ldd | 用于显示可执行文件或共享库所依赖的动态链接库 | ldd ./dist |
| hexdump | 查看二进制文件内容的工具,可将文件内容以 ASCII、八进制、十进制、十六进制等多种格式输出,非常适合分析非文本文件或调试数据流 | hexdump [选项] 文件名 |
| nm | 查看二进制目标文件、库文件、可执行文件符号表的重要工具,常用于调试、分析链接问题和逆向工程。 | nm [选项] 文件名 |
| man(如果有任何不知道的命令,函数就去问man,这个男人啥都知道) | manual(手册) 命令用来查看 Linux 系统命令、函数、配置文件、系统调用等的官方文档。几乎所有标准程序和工具都有对应的 man 手册 | man [options] [section number] [command name] * options :选项 * section number :章节编号 * command name :要搜索的命令名称 |
#
6. 简单使用场景
假设你拿到一个名为 pwn_me的二进制文件,一个典型的初步分析流程可能是:
- 检查保护机制:
checksec pwn_me - 查看文件类型:
file pwn_me - 尝试运行(如果需要先给权限):
chmod +x pwn_me->./pwn_me - 反汇编寻找可疑函数:
objdump -d pwn_me | grep -A 10 -B 2 "gets"(查找危险函数)【此步骤一般使用IDA软件完成,更加方便】 - 用 gdb 调试:
gdb ./pwn_me->(gdb) r(运行) - 编写好 exp.py 后利用:
python3 exp.py - 成功后获取flag:如果 exploit 成功获得了 shell,常用
cat命令读取 flag。
二、checksec 命令详解
checksec是一个 shell 脚本,用于检查二进制文件(如可执行文件、库文件)启用了哪些安全保护机制。这对于快速评估程序的攻击难度至关重要。
安装
-
Debian/Ubuntu:
sudo apt install checksec -
Arch Linux:
sudo pacman -S checksec(多数主流 Linux 发行版的仓库中都提供了 checksec 包)
常用命令
checksec --file=/path/to/binary
输出示例与解读
$checksec--file=./vuln_program
RELROSTACKCANARYNXPIERPATHRUNPATHSymbolsFORTIFYFortifiedFortifiableFILE
PartialRELROCanaryfoundNXenabledNoPIENoRPATHNoRUNPATH85)SymbolsNo00./vuln_program
-
RELRO(Relocation Read-Only): -
Partial RELRO: GOT (Global Offset Table) 部分可写,较容易利用 GOT 覆写攻击。 -
Full RELRO: GOT 完全只读,有效防止 GOT 覆写攻击,但会略微增加启动开销。 -
STACK CANARY: -
Canary found: 启用了栈溢出保护(栈金丝雀)。在函数返回前验证栈上的特定值是否被改变,用于检测栈溢出攻击。 -
No canary found: 无栈保护,存在栈溢出漏洞时更容易利用。 -
NX(Non-eXecutable): -
NX enabled: 数据区域(如栈、堆)不可执行。防止将 shellcode 写入数据区后跳转执行。 -
NX disabled: 数据区域可执行,为攻击者提供了便利。 -
PIE(Position-Independent Executable): -
PIE enabled: 程序代码段、数据段的加载地址随机化。要求攻击者利用信息泄露等手段获取地址,增加了利用难度。 -
No PIE: 程序加载基址固定,便于攻击者计算 gadgets 和函数的准确地址。 -
Symbols: -
表示是否包含调试符号(如函数名、变量名)。
Stripped(已剥离)会增加分析难度,Not Stripped(未剥离)则更易于分析。
三、gdb 命令详解
gdb是功能强大的命令行调试器,用于动态分析程序行为,如跟踪执行流、查看内存、修改寄存器等,是漏洞分析的核心工具。
常用命令与示例
(编译时请加上 -g选项以包含调试信息,例如 gcc -g -o program program.c)
-
启动与运行
-
gdb ./program: 启动调试。 -
(gdb) run <arg1> <arg2>: 运行程序,可带参数。 -
(gdb) start: 在主函数入口暂停,类似在main函数开头下了断点。 -
断点控制
-
(gdb) break main: 在main函数开头设置断点。 -
(gdb) break *0x400512: 在指定地址设置断点。 -
(gdb) info breakpoints: 查看所有断点信息。 -
(gdb) delete 1: 删除编号为 1 的断点。 -
执行控制
-
(gdb) continue: 继续运行直到下一个断点或程序结束。 -
(gdb) nexti(ni): 执行一条汇编指令,不进入函数调用。 -
(gdb) stepi(si): 执行一条汇编指令,会进入函数调用内部。 -
(gdb) finish: 继续运行直到当前函数返回。 -
查看信息
-
格式语法:
x/[数量][格式][单位] <地址或表达式> -
常用格式:
x(十六进制),i(指令),s(字符串) -
常用单位:
b(字节),h(半字,2字节),w(字,4字节),g(巨字,8字节) -
(gdb) info registers: 查看所有寄存器的当前值。 -
(gdb) x/20wx $esp: 检查内存。20wx表示以 4 字节十六进制格式显示 20 个字。 -
(gdb) disassemble main: 反汇编main函数。 -
(gdb) print $eax: 打印eax寄存器的值。 -
(gdb) backtrace(bt): 显示当前的调用栈(函数调用链),在分析崩溃时非常有用。 -
实用插件/增强
-
Pwndbg, GEF, Ped: 这些都是强大的
gdb增强插件,提供了更友好的界面和更强大的命令(如堆分析、漏洞利用辅助等),强烈建议安装使用。
四、ROPgadget 命令详解
ROPgadget用于自动提取二进制文件中的 gadgets(通常以 ret指令结尾的短指令序列),这些 gadgets 是构建 ROP (Return-Oriented Programming) 链的基础,常用于绕过 NX保护。
安装
- 通常可通过 pip 安装:
pip install ROPgadget
常用命令与示例
ROPgadget --binary ./vuln_program
- 这会提取
./vuln_program中所有可能的 gadgets 并输出。
常用选项
--binary <文件>: 指定要分析的二进制文件。--opcode <字节序列>: 搜索包含特定操作码(机器码)的 gadget(例如--opcode c3搜索ret)。--only "pop|ret": 只显示包含特定指令的 gadgets。--string <字符串>: 在可执行段中搜索指定的字符串(例如--string "/bin/sh")。--nojop: 不显示 JOP gadgets (以jmp等指令结尾的 gadget)。
输出解读:
输出会列出所有找到的 gadgets 及其地址:
...
0x080583d9 : popeax; ret
0x080483b0 : popebx; ret
0x08048535 : popedi; pop ebp ; ret
0x080484c5 : movdwordptr [edx], eax; ret
...
- 每一行是一个 gadget 的地址和指令序列。
- 在构造 ROP 链时,你需要将这些 gadgets 的地址按照执行顺序排列,覆盖到栈上。当程序执行
ret指令时,就会跳转到你布置的 gadget 地址,并依次执行下去,最终达成目的(如调用system("/bin/sh"))。
理解你对 file命令在Pwn场景下应用的兴趣。下面我用一个与Pwn相关的例子,为你详细讲解 file命令的输出含义。
五、file 命令详解
file命令用于快速确定文件的类型和格式,它通过检查文件的魔数 (Magic Number) 或内容特征来判断,而非单纯依赖文件扩展名。
假设你从CTF比赛中获得了一个名为 pwn_me的二进制文件。你不确定它的类型和架构,这时 file命令就能提供关键信息。
常用命令与示例
file ./pwn_me
一个典型的输出可能是:
./pwn_me: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=7c8c16c087736918641bacfc8916b6b84b8c5c78, not stripped
【file命令还有一些实用选项:
file -b ./pwn_me:简洁模式,只显示文件类型信息,不显示文件名。file -i ./pwn_me:显示文件的 MIME 类型(如application/x-executable)】
输出解读
| 输出内容 | 含义解读 | 对Pwn的意义 |
| — | — | — |
| ELF | 可执行与可链接格式 (Executable and Linkable Format),这是Linux下标准可执行文件格式。 | 确认这是一个可以在Linux系统上运行的程序,是Pwn分析的主要对象。 |
| 64-bit | 这是一个64位的二进制程序。 | 决定了后续分析(如汇编指令、寄存器、函数调用约定)都需基于x86-64架构。 |
| LSB executable | 小端序 (Least Significant Byte) 可执行文件。 | 内存中数据的字节序,影响payload的构造方式。 |
| x86-64 | CPU架构是 x86-64(即AMD64/Intel 64)。 | |
| dynamically linked | 程序是动态链接的。 | 意味着它依赖系统中的共享库(如 libc.so.6)。这通常有利于攻击者,因为可以通过覆写GOT表或利用libc中的函数(如 system)来利用漏洞。 |
| interpreter /lib64/ld-linux-x86-64.so.2 | 指定了动态链接器的路径。 | |
| not stripped | 符号表未被剥离。 | 这是一个重大利好! 意味着二进制文件中保留了函数名、变量名等调试符号。在IDA等反汇编工具中能看到 main、vuln_func等函数名,极大降低了逆向分析的难度。 |
| BuildID[sha1]=... | 编译构建的唯一标识符。 | 用于精确匹配调试信息或特定版本的二进制文件。 |
六、IDA
查看字符串
| | | | — | — | | Shift+F12 | |
查看函数交叉引用
函数调用
Stcak of function
r 应该是函数的返回地址
s 应该是ebp
显示字节码
#
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:绿洲安全 tlnshuju《PWN入门笔记-命令篇》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论