appleweiping/asu-cse466
GitHub: appleweiping/asu-cse466
ASU CSE466 计算机系统安全课程的本地可运行教育实验集合,包含六个模块的自编漏洞靶标及经过验证的 exploit 解题器。
Stars: 0 | Forks: 0
# ASU CSE466 — 计算机系统安全 (pwn.college) 本地练习仓库
-brightgreen)


## 教育目的(请务必阅读)
本仓库是**对公开大学课程的授权自学**。这里的每一个练习
仅针对**本仓库中的代码** —— 即我编写、编译并在我自己的 WSL2 沙箱中运行的
故意存在漏洞的二进制文件,且禁用了课程标准的缓解机制(`-fno-stack-protector`, `-no-pie`, `-z execstack`, …)。这
里的 "flag" 是硬编码的教育性字符串,例如 `pwn.college{local_..._demo}`;
没有一个是真实的 pwn.college flag。这里**没有任何针对真实的、
第三方或生产系统的内容** —— 没有恶意软件,没有 C2,没有 DoS,没有
网络攻击,也没有用于恶意用途的检测规避。目标是使用该课程自身的自包含漏洞靶标风格,
学习并记录 CSE466 所教授的攻防*技术*。
## 概述
CSE466 (pwn.college) 是一门基于挑战的课程:**13 个模块 / 358 个托管**
挑战,涵盖 Linux CLI 与程序滥用、shellcoding、逆向工程、程序漏洞利用、系统漏洞利用,以及一个杂项
赛道(沙箱、内存错误、竞态条件)。评分挑战位于托管的 dojo 上,无法离线镜像。
本仓库实现了一个**内容丰富、真正可运行的代表性子集**:
六个模块,每个模块包含一个真实的漏洞靶标 + 一个已验证的有效解题器,
并通过在 WSL2 Ubuntu(glibc 2.39, gcc 13.3)中**实际运行**进行了验证。没有存根,没有虚假
结果 —— 下面的每一个 "flag" 都是由实际执行的 exploit 产生的。
## 结果(在 WSL2 Ubuntu 24.04, x86-64, gcc 13.3.0, glibc 2.39, pwntools 4.15 上测得)
| 模块 (CSE466 主题) | 我构建的靶标 | 技术 | 验证结果 |
|---|---|---|---|
| **01 Linux CLI / 程序滥用** | `root:root 0400` flag + setuid-root `cat`/`find` | GTFOBins setuid privesc | `student` 直接读取被拒绝;setuid 工具读取 flag,**euid 1004 → 0** |
| **02 Shellcoding** | `loader.c` RWX 注入框架 | 手写 **null-free** `execve` shellcode | **23 字节,无 null bytes**,生成 `/bin/sh` (`uid=0`) |
| **03 逆向工程** | 去除符号的 `crackme` | 静态分析 → 逆向变换 → keygen | 恢复密钥 `R3v3rs1ng_CSE466` → flag `pwn.college{l0cal_cr4ckme}` |
| **04 内存破坏** | 溢出,`execstack`,no-PIE,no-canary | **ret2win** + **ret2shellcode** | 偏移量 72;打印 win() flag;注入的 shellcode 生成 shell |
| **05 返回导向编程** | 溢出,**启用 NX**,静态编译,no-PIE | **SROP** (sigreturn-oriented) | 通过伪造信号帧执行 `execve("/bin/sh")` → shell |
| **06 沙箱** | raw-BPF **seccomp** jail | execve 被阻止;**orw** shellcode | execve shellcode **被 SIGSYS (31) 杀死**;orw 读取 flag |
完整捕获的记录:[`results/`](results/)(每个模块一份日志)。
### 示例:SROP 绕过 NX (`results/05-rop-srop.log`)
```
[*] offset=72
[*] pop rax; ret @ 0x42146b syscall @ 0x401324 /bin/sh @ 0x47f010
============================================================
SHELL_UID=0:root
============================================================
[+] SROP execve chain spawned a shell
```
### 示例:seccomp 阻止 execve,orw 逃逸 (`results/06-sandboxing.log`)
```
[1] execve shellcode -> exit status -31 (KILLED by signal 31) # SIGSYS
[2] orw shellcode (58 bytes) -> flag read: True
pwn.college{seccomp_orw_escape_demo}
[+] sandbox verified: execve blocked, orw succeeds
```
## 已实现的模块
- [x] **01 — Linux CLI / 程序滥用** — setuid GTFOBins 权限提升 ([目录](01-linux-cli/))
- [x] **02 — Shellcoding** — null-free `execve` shellcode + 注入加载器 ([目录](02-shellcode/))
- [x] **03 — 逆向工程** — 去除符号的 crackme,手动逆向工程 + 自动化 keygen ([目录](03-reverse-engineering/))
- [x] **04 — 内存破坏** — ret2win + ret2shellcode ([目录](04-memory-corruption/))
- [x] **05 — 返回导向编程** — SROP `execve` 链 ([目录](05-rop/))
- [x] **06 — 沙箱** — seccomp-BPF jail + orw shellcode ([目录](06-sandboxing/))
## 文档记录的部分(诚实说明范围)
pwn.college 是一个**托管的、有评分的平台**:这 358 个挑战在 ASU 的 dojo
基础设施上运行,为每个用户提供专属 flag,并在服务器端记录进度。那部分评分
内容**无法离线镜像**,也**没有**在这里重现。
同样,**系统漏洞利用**模块(自定义内核模块 / 内核
权限提升,模块 5)需要 dojo 的插桩内核虚拟机,因此
**超出了本地范围**。相反,本仓库提供的是对六个代表性模块的*技术*进行的忠实、离线
复现,针对我自己的漏洞靶标,每一项都通过实际执行进行了验证。没有任何托管挑战被声称“已解决”。
## 项目结构
```
asu-cse466/
├── env/setup.sh # install pwntools venv + toolchain check
├── 01-linux-cli/ # setuid program-misuse privesc (solve.sh)
├── 02-shellcode/ # execve_shellcode.asm, loader.c, solve.py
├── 03-reverse-engineering/ # crackme.c, solve_manual.md, solve.py
├── 04-memory-corruption/ # vuln.c, solve_ret2win.py, solve_ret2shellcode.py
├── 05-rop/ # rop_vuln.c, solve_rop_execve.py (SROP)
├── 06-sandboxing/ # seccomp_jail.c, orw_shellcode.asm, solve.py
├── scripts/run_all.sh # build + run everything, capture results/
├── results/ # real captured transcripts (one log per module)
└── requirements.txt # pwntools>=4.15
```
## 如何运行
一切都在 **WSL2 Ubuntu** 中运行(Linux 二进制漏洞利用;这些实验无法在 Windows 上原生
运行)。setuid/execstack 语义要求一个 **ext4** 工作
目录 —— 模块 01 正是出于这个原因将其自身暂存在 `/tmp` 中。
```
# 一次性环境设置(在 $HOME 中创建一个独立的 pwntools venv)
bash env/setup.sh
# 构建所有目标,运行所有 solver,捕获 results/*.log
PWN_PY=$HOME/.venv-pwn/bin/python sudo -E bash scripts/run_all.sh
# 或者运行单个模块,例如:
cd 05-rop && bash build.sh && $HOME/.venv-pwn/bin/python solve_rop_execve.py
```
## 验证
每个解题器都会**断言** exploit 成功执行并打印捕获的 shell/flag;顶层
的 `scripts/run_all.sh` 会将每次运行重定向输出到 `results/`。上表中的结果是从这些日志中原样
复制的。关键验证:
- shellcode 在注入前被检查为包含**零个 null bytes**,并且
生成的进程通过子 shell 中真实的 `id` 命令报告 `uid=0`;
- 溢出偏移量 (72) 是**从反汇编中推导出来的**,而不是猜的;
- 使用 SROP 正是因为该二进制文件确实缺少干净的
`pop rsi/rdx` gadgets(已通过 ROPgadget 确认) —— 这是一个真实的约束,而不是
生搬硬套;
- seccomp jail 的默认动作会**杀死** execve shellcode(exit status −31 =
SIGSYS),而相同的基础设施却允许 orw shellcode。
## 技术栈
C,x86-64 汇编(Intel 语法),使用 **pwntools** 的 Python 3(asm/ELF/ROP/
SigreturnFrame/process),GNU binutils(`gcc`, `objdump`, `strip`),ROPgadget,
Linux seccomp-BPF。在 WSL2 Ubuntu 中仅使用 CPU 运行。
## 核心思路 / 我学到了什么
- **Shellcoding:** 编写位置无关、**null-free** 的 syscall shellcode
以及让“代码注入”变得具体可感的 mmap-RWX 注入原语。
- **逆向工程:** 直接从反汇编中读取变换逻辑,
锚定嵌入式数据,并将其转化为一个逆向的 keygen。
- **内存破坏:** 返回地址覆盖,movaps 栈对齐陷阱,
以及自破坏 shellcode 的坑(通过降低 `rsp` 来修复)。
- **ROP / SROP:** 为什么 NX 会迫使代码重用,以及在缺乏 gadget 的二进制文件上,**sigreturn** 是如何将一个
`syscall` + 一个 `pop rax` 转化为对寄存器的完全控制的。
- **沙箱:** 经典 BPF seccomp 过滤器,以及为什么被 jail 的 exploit 必须将
从 `execve` 转向 **open/read/write** ("orw") 技术。
## 致谢与许可
基于 **Yan Shoshitaishvili &
Connor Nelson (Arizona State University)** 的 **CSE 466 — 计算机系统安全**课程,在
[pwn.college](https://pwn.college/) 上讲授。本仓库是对该课程*技术*针对自编漏洞靶标的独立教育性
复现;所有课程材料和托管的 dojo 均归其原作者所有。这里的原始代码基于 [MIT License](LICENSE) 发布。
标签:Shellcode, Web报告查看器, x86-64汇编, 云资产清单, 安全教育, 技术调研, 逆向工程