appleweiping/asu-cse466

GitHub: appleweiping/asu-cse466

ASU CSE466 计算机系统安全课程的本地可运行教育实验集合,包含六个模块的自编漏洞靶标及经过验证的 exploit 解题器。

Stars: 0 | Forks: 0

# ASU CSE466 — 计算机系统安全 (pwn.college) 本地练习仓库 ![status](https://img.shields.io/badge/status-complete%20(documented%20partial)-brightgreen) ![language](https://img.shields.io/badge/C%20%2F%20x86--64%20asm%20%2F%20Python-informational) ![license](https://img.shields.io/badge/license-MIT-blue) ## 教育目的(请务必阅读) 本仓库是**对公开大学课程的授权自学**。这里的每一个练习 仅针对**本仓库中的代码** —— 即我编写、编译并在我自己的 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汇编, 云资产清单, 安全教育, 技术调研, 逆向工程