代码改变世界

深入解析:pwn知识点——命令篇

2025-09-16 08:47  tlnshuju  阅读(114)  评论(0)    收藏  举报

一、Linux常用指令

1. 基础文件操作

这些命令用于浏览、查看和管理文件,是分析题目附件的基础。

命令

功能说明

示例或备注

ls

列出目录内容

ls -la显示详细文件信息(包括隐藏文件)

cd

切换当前工作目录

cd /tmp

cat

查看文件内容

常用于直接读取flag​:cat flagcat /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

查看和配置网络接口信息

ifconfigip addr

wget/ curl

下载文件

wget http://example.com/pwn_binary下载文件

3. 进程与系统信息

查看系统状态、进程信息和管理进程。

命令

功能说明

示例或备注

ps

显示当前进程状态

ps auxps -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查看程序调用的库函数

6. 简单使用场景

假设你拿到一个名为 pwn_me的二进制文件,一个典型的初步分析流程可能是:

  1. 检查保护机制​:checksec pwn_me

  2. 查看文件类型​:file pwn_me

  3. 尝试运行​(如果需要先给权限):chmod +x pwn_me-> ./pwn_me

  4. 反汇编寻找可疑函数​:objdump -d pwn_me | grep -A 10 -B 2 "gets"(查找危险函数)【此步骤一般使用IDA软件完成,更加方便】

  5. 用 gdb 调试​:gdb ./pwn_me-> (gdb) r(运行)

  6. 编写好 exp.py 后利用​:python3 exp.py

  7. 成功后获取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
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的意义

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等反汇编工具中能看到 mainvuln_func等函数名,​极大降低了逆向分析的难度

BuildID[sha1]=...

编译构建的唯一标识符。

用于精确匹配调试信息或特定版本的二进制文件。