前言:
线下赛一般都断网,这里总结一些会用到的知识
Linux 底层函数查阅指南
如果忘记了某个系统调用或 C 库函数(比如 puts 是遇到 \x00 停还是 \n 停?read 的参数顺序是什么?)
用Linux 自带的查询命令:man (Manual) 手册。
核心命令速查
查 C 语言标准库函数(第 3 章):
man 3 puts # 查 puts 的用法、返回值、截断机制
man 3 printf # 查格式化字符串
关于函数到底怎么处理数据的核心逻辑,写在 man 手册最开头的 DESCRIPTION (描述) 部分里。
查底层系统调用(第 2 章):在手搓 Shellcode 或 Ret2syscall 时必用。
man 2 read # 查 read 系统调用
man 2 execve # 查启动 shell 的核心调用
Man 手册快捷键 (Vim 逻辑)
j/k:上下滚动一行Space(空格):向下翻一页/关键字:全文搜索(例如/return value找返回值说明),按n找下一个,N找上一个。q:退出手册。
Pwntools
以下核心模板,能覆盖 90% 的常规题型。
环境与连接初始化
1 | from pwn import * |
交互与发包 (极其容易踩坑)
1 | # --- 发送 --- |
数据转换与打包 (大小端转换)
1 | # 将数字打包成字节流 (Little-Endian 小端序) |
ELF 与 Libc 快捷搜索
1 | # ELF 对象神器 |
系统调用与 Shellcode (asm & shellcraft)
在打 ret2syscall 或需要手写系统调用时,不再需要死记硬背 execve 的调用号了,Pwntools 提供了一键生成与查询:
1 | # 获取系统调用号 (根据开头的 context.arch 自动适配 32位/64位) |
GDB-Pwndbg 动态调试真经
将 GDB 挂载到 Python 脚本中
Pwntools 提供了两种极其方便的挂载方式:
方式一:gdb.attach() (中途挂载,最常用)
1 | io = process('./vuln') |
方式二:gdb.debug() (启动即挂载)
1 | # 直接以 GDB 调试模式启动进程 |
执行控制与断点配置
基础步进
c (continue):一直运行,直到遇到下一个断点或程序崩溃(SIGSEGV)。
n (next):源码级单步步过(不进入子函数)。
s (step):源码级单步步入(会跟进子函数)。
ni / si:汇编级单步步过 / 步入(次执行一条汇编指令,不漏过任何寄存器变化)。
fin (finish):直接执行完当前函数并返回。
断点管理
b main:给特定函数名下断点。
b *0x401234:给绝对内存地址下断点(注意前面的星号 * 绝对不能漏!)。
b *$rebase(0x1234):PIE 开启时的神技! 给相对偏移下断点,Pwndbg 会自动帮你加上本次运行的随机化基址。
info b:查看当前所有断点状态。
del 1:删除编号为 1 的断点。
watch *0x404040:内存硬件断点(极其好用),只要这个内存地址里的值被修改,程序立刻断下!
内存观测与数据修改
万能的 x 命令 (Examine) 格式:x/<数量><格式><大小> <地址/寄存器>
x/10gx $rsp:以十六进制 (x)、8字节 (g) 为单位,打印栈顶 ($rsp) 往下的 10 个数据。x/10wx $ebp-0x10:以十六进制 (x)、4字节 (w) 为单位,打印指定地址数据。x/s 0x402000:把该地址的数据当作字符串打印出来(检查/bin/sh是否写入成功)。x/20i $rip:把当前指令指针往后的 20 个字节当作汇编指令反汇编出来。
修改寄存器/内存
set $rax = 0:强行把 rax 寄存器的值改为 0(常用于绕过条件判断)。set *0x404040 = 0x1234:强行向内存地址写入指定值。
Pwndbg 实战专属技巧
全景视角:
context如果你清屏了或者界面乱了,直接输入context可以立刻重新唤出 Pwndbg 的四大面板(寄存器区、反汇编区、源码区、栈区)。内存权限雷达:
vmmap查看当前所有内存段(代码段、栈、堆、libc)的基址和权限。遇到段错误崩溃时,第一反应打vmmap,看目标地址到底是不是rwx(往往是因为想执行 shellcode 却跳到了rw-的不可执行段)。超级栈透视:
telescope(简写tele)tele 20或者tele $rsp 20:以极度优雅的格式打印栈顶往下的 20 个单位。神级特性:它不仅印出数值,还会递归解析指针!如果栈上有一个地址指向 libc,它会直接在一旁标出
-> libc_system_addr,找链子极其方便。
大海捞针:
searchsearch "/bin/sh":在整个内存空间里搜索目标字符串。search -p 0xdeadbeef:在内存里寻找有没有哪个指针刚好指向了这个特定的地址。
计算溢出长度:
cyclic如果在 IDA 里看不出数组距离返回地址多远:终端运行
cyclic 200生成 200 个规律乱码字符(如aaaabaaacaaa...)。把乱码当作 payload 发送,程序崩溃报错,此时
rip或ebp会被某个乱码(比如0x61616164)覆盖。回到 GDB 终端运行
cyclic -l 0x61616164,直接光速算出精确的 Padding 长度!
追踪执行流:
retaddr和gotretaddr:瞬间打印出当前栈上所有的返回地址链(相当于增强版的 Backtrace)。got:打印程序当前的 GOT 表状况,直观看到哪个函数被我们劫持了。libc:直接打印出当前加载的 libc 基地址,方便你做本地偏移计算验证。
- 本文链接: http://example.com/2026/03/15/PWN/pwn_attack/PWN通用问题/断网后相关知识查询/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
欢迎关注我的其它发布渠道