Linux 漏洞利用基础
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/basic-exploitation-6l3a。
技能介绍
要解决什么问题
通过 fuzzing 或审计,你通常已经拿到了一个稳定的崩溃输入。但崩溃本身没有价值,漏洞利用的核心问题只有一个:如何把一次可控的内存破坏,变成对程序执行流程的实际接管。具体来说,缓冲区溢出之后,返回地址被改写,ret 指令弹出的下一个地址就是你的;这个地址怎么精确定位、怎么被稳定控制、以及控制之后下一步跳到哪,是这条链路上真正的难点。
技能如何工作
该技能围绕 Week 5 课程展开,在关闭现代缓解措施的 Ubuntu x86-64 环境中,系统讲解经典利用技术:
- EIP/RIP 控制:使用 pattern 定位偏移,用
cyclic -l反查确切的覆盖长度 - 栈布局与 AMD64 差异:
RBP对齐、16 字节栈对齐、r10替代rcx的 syscall 参数顺序 - Shellcode 注入:手工组装
execve("/bin/sh")的 23 字节 AMD64 shellcode - ROP chain 与 ret2libc:
jmp rsp/call rspgadget 作为稳定跳转目标 - 缓解措施绕过思路:ASLR、NX、stack canary 的基本原理,为 Week 7 的完整绕过打基础
- 环境与调试卫生:
env -i、pwndbg、checksec、setarch -R的规范化用法
关键步骤按天组织:搭建实验环境 → 编译 vuln1 并验证 checksec 输出 → 确定偏移 → 在 GDB 中验证 RIP 控制 → 组装完整 exploit → 调试直到稳定拿到 shell。
适用边界与注意点
- 本技能刻意关闭 DEP/ASLR/canary,目的是先掌握纯利用技术;不要把它当作绕过真实防护的方案
- ASLR 在系统层面应保持开启,只在实验进程内通过
setarch -R或 GDB 的set disable-randomization on禁用 - 永远不要硬编码栈地址。GDB 与真实执行的栈地址因环境变量差异可偏移数百字节,必须用泄露或 NOP sled
- AMD64 的
call前需要 16 字节对齐,栈对齐错误会导致 libc 内部 segfault - 缓冲区处理要用
p.recvuntil()而非sleep();p.recv()不保证取到全部数据,必要时用p.clean() - Ubuntu 24.04 使用 glibc 2.39,含完整 safe-linking;做经典堆利用练习建议用 Docker 跑旧版 Ubuntu
这些坑每一项都能让 exploit 在 GDB 里成功、在真实运行中失败,调试清单比最终 payload 更重要。
使用场景
- 正在学习漏洞利用,需要搭建关闭保护的 Linux 靶场环境
- 已有一个程序崩溃输入,想定位缓冲区溢出偏移并控制 RIP
- 需要编写 pwntools exploit,用 jmp rsp gadget 执行 shellcode
- 在做题或红队评估中,需绕过 ASLR/NX/canary 之前的基础知识验证
适合人员
- 刚开始学 Pwn 的高校或自学者,想理解栈溢出如何变成 shell
- 安全研究员,需要把 fuzz 得到的崩溃转成可利用 PoC
- 红队工程师,在授权靶场练习 Linux 基础利用与调试技巧
- CTF 选手,准备参加二进制利用方向比赛