深入解析:pwn知识点——命令篇
2025-09-16 08:47 tlnshuju 阅读(114) 评论(0) 收藏 举报一、Linux常用指令
1. 基础文件操作
这些命令用于浏览、查看和管理文件,是分析题目附件的基础。
命令 | 功能说明 | 示例或备注 |
|---|---|---|
| 列出目录内容 |
|
| 切换当前工作目录 |
|
| 查看文件内容 | 常用于直接读取flag: |
| 查找文件 |
|
| 在文件中搜索特定字符串 |
|
| 查看文件类型 |
|
| 反汇编二进制文件 |
|
| 显示 ELF 文件信息 |
|
| 修改文件权限 | 常用来给二进制文件添加可执行权限: |
| 复制 / 移动 / 删除文件 | |
| 创建空文件 | |
| 创建目录 |
2. 网络连接
与远程靶机交互、传输数据或测试网络。
命令 | 功能说明 | 示例或备注 |
|---|---|---|
| 连接远程靶机或开启端口监听 |
|
| 检查网络连通性 |
|
| 查看和配置网络接口信息 |
|
| 下载文件 |
|
3. 进程与系统信息
查看系统状态、进程信息和管理进程。
命令 | 功能说明 | 示例或备注 |
|---|---|---|
| 显示当前进程状态 |
|
| 动态显示进程状态和系统资源使用情况 | |
| 终止进程 |
|
| 打印系统信息 |
|
| 查看环境变量 | |
| 显示 shell 变量和环境变量 | |
| 设置环境变量 |
|
4. 权限管理
在权限提升或需要特定权限操作时使用。
命令 | 功能说明 | 示例或备注 |
|---|---|---|
| 以 root 权限执行命令 |
|
| 切换用户身份 |
|
| 改变文件所有者 |
|
| 改变文件所属组 |
5. Pwn 专用工具
这些是二进制漏洞利用的核心工具,并非系统内置命令,但通常需要在 Linux 环境下安装和使用。
命令 | 功能说明 | 示例或备注 |
|---|---|---|
| 检查二进制文件的安全保护机制(如 NX, PIE, Canary, RELRO) |
|
| GNU 调试器,用于动态调试 |
|
| 反汇编二进制文件 |
|
| 显示 ELF 文件信息 |
|
| 自动查找二进制文件中的 ROP gadget |
|
| 运行 exploit 脚本 |
|
| Python 的 Pwn 工具库(在 Python 脚本中 | |
| 跟踪系统调用 |
|
| 跟踪库函数调用 |
|
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 checksecArch Linux:
sudo pacman -S checksec(多数主流 Linux 发行版的仓库中都提供了 checksec 包)
常用命令
checksec --file=/path/to/binary
输出示例与解读
$ checksec --file=./vuln_program
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
Partial RELRO Canary found NX enabled No PIE No RPATH No RUNPATH 85) Symbols No 0 0 ./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: 继续运行直到当前函数返回。
查看信息
(gdb) info registers: 查看所有寄存器的当前值。(gdb) x/20wx $esp: 检查内存。20wx表示以 4 字节十六进制格式显示 20 个字。格式语法:
x/[数量][格式][单位] <地址或表达式>常用格式:
x(十六进制),i(指令),s(字符串)常用单位:
b(字节),h(半字,2字节),w(字,4字节),g(巨字,8字节)
(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 : pop eax ; ret
0x080483b0 : pop ebx ; ret
0x08048535 : pop edi ; pop ebp ; ret
0x080484c5 : mov dword ptr [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的意义 |
|---|---|---|
| 可执行与可链接格式 (Executable and Linkable Format),这是Linux下标准可执行文件格式。 | 确认这是一个可以在Linux系统上运行的程序,是Pwn分析的主要对象。 |
| 这是一个64位的二进制程序。 | 决定了后续分析(如汇编指令、寄存器、函数调用约定)都需基于x86-64架构。 |
| 小端序 (Least Significant Byte) 可执行文件。 | 内存中数据的字节序,影响payload的构造方式。 |
| CPU架构是 x86-64(即AMD64/Intel 64)。 | |
| 程序是动态链接的。 | 意味着它依赖系统中的共享库(如 |
| 指定了动态链接器的路径。 | |
| 符号表未被剥离。 | 这是一个重大利好! 意味着二进制文件中保留了函数名、变量名等调试符号。在IDA等反汇编工具中能看到 |
| 编译构建的唯一标识符。 | 用于精确匹配调试信息或特定版本的二进制文件。 |
浙公网安备 33010602011771号