目均模拟真实CTF赛题,需结合动态调试与工具链(pwntools/ROPgadget/one_gadget)完成利用。
覆盖栈、堆、格式化字符串、高级堆利用、沙箱逃逸五大方向,从基础ROP到House of Apple
,逐步提升对抗防护的能力。
题目1:栈溢出+ROP绕过NX与Canary
名称:babyrop
描述:目标程序是一个64位ELF文件,存在栈溢出漏洞,但开启了NX和Canary保护。请获取远程服务器的shell。
考察点:Canary泄露、ROP链构造、基础栈溢出利用。
解答步骤:
- 漏洞分析:
-
逆向发现程序在读取输入时使用
gets
函数,导致栈溢出。 -
输入长度超过缓冲区后,可以覆盖Canary和返回地址。
-
- 利用思路:
-
通过溢出泄露Canary值,绕过栈保护。
-
构造ROP链调用
system("/bin/sh")
绕过NX。
-
- EXP关键代码:
from pwn import * p = process('./babyrop') payload = b'A'*offset_canary + p64(canary) + b'A'*8 + rop_chain p.sendline(payload) p.interactive()
详细解答:
-
使用
%p
格式字符串泄露Canary(或通过逐字节爆破)。 -
利用
ROPgadget
查找pop rdi; ret
和system
地址,拼接ROP链。
题目2:堆溢出+Unlink攻击
名称:heap_unlink
描述:一个32位程序存在堆溢出漏洞,允许覆盖相邻堆块的size
字段,触发Unlink攻击。
考察点:堆布局、Unlink利用、伪造堆块结构。
解答步骤:
- 漏洞分析:
-
输入数据时未检查长度,导致堆溢出,可覆盖下一个堆块的
prev_size
和size
字段。
-
- 利用思路:
-
伪造一个空闲堆块,通过Unlink操作实现任意地址写。
-
覆盖
free@got
为system
地址,触发free("/bin/sh")
。
-
- EXP构造:
# 伪造堆块结构 fake_chunk = p32(0xdeadbeef) + p32(heap_addr - 12) # fd/bk指针 payload = b'A'*overflow_size + p32(0x80) + p32(0x88 | 0x1) + fake_chunk
详细解答:
-
通过溢出修改
size
的PREV_INUSE
位,触发合并操作。 -
利用Unlink的
FD->bk = BK
和BK->fd = FD
实现任意地址写入。
题目3:格式化字符串+栈迁移
名称:fmt_stack_pivot
描述:程序存在格式化字符串漏洞和栈溢出漏洞,但溢出空间不足,需结合栈迁移技术完成利用。
考察点:格式化字符串泄露、栈迁移(Stack Pivot)、ROP链构造。
解答步骤:
- 漏洞分析:
-
使用
printf(user_input)
导致格式化字符串泄露libc地址。 -
栈溢出长度不足以覆盖返回地址,但可覆盖
rbp
。
-
- 利用思路:
-
泄露栈地址和libc基址。
-
覆盖
rbp
为可控内存地址,通过leave; ret
指令实现栈迁移。
-
- EXP关键代码:
payload = fmtstr_payload(offset, {printf_got: system_addr}) # 格式化字符串覆盖GOT表 payload += p64(migrated_stack_addr) # 覆盖rbp
详细解答:
-
利用
%n
向rbp
位置写入目标地址。 -
迁移后在新栈布置ROP链调用
system("/bin/sh")
。
题目4:Use After Free + Fastbin Attack
名称:uaf_fastbin
描述:程序在释放堆块后未清空指针,可通过UAF修改fd
指针,实现任意地址分配。
考察点:UAF漏洞利用、Fastbin Attack、内存布局。
解答步骤:
- 漏洞分析:
-
释放堆块后仍能使用悬垂指针修改其
fd
值。
-
- 利用思路:
-
修改
fd
指向伪造的Fastbin链,分配堆块到__malloc_hook
附近。 -
覆盖
__malloc_hook
为one_gadget
地址。
-
- EXP构造:
# 分配并释放堆块A free(A) # 通过UAF修改A的fd为fake_addr edit(A, p64(fake_addr)) # 再次分配两次,第二次得到fake_addr处的堆块
详细解答:
-
计算
__malloc_hook
附近的可用地址(如利用0x7f
对齐特性)。 -
使用
one_gadget
工具查找可直接触发shell的gadget。
题目5:高级堆利用+沙箱逃逸
名称:house_of_apple
描述:程序开启沙箱(禁用execve),需通过堆漏洞构造ORW链读取flag文件。
考察点:House of系列利用、沙箱逃逸、SROP(Sigreturn-Oriented Programming)。
解答步骤:
- 漏洞分析:
-
存在任意地址写漏洞,可劫持
_IO_list_all
指针。 -
沙箱限制只能使用
open/read/write
系统调用。
-
- 利用思路:
-
伪造
_IO_FILE
结构体,触发_IO_flush_all_lockp
中的函数调用链。 -
构造ROP链调用
open("flag")
、read(fd, buf, 0x100)
、write(1, buf, 0x100)
。
-
- EXP关键代码:
# 伪造_IO_FILE结构 fake_file = p64(0) * 18 + p64(0) + p64(1) + p64(0xffffffff) + p64(rop_chain_addr)
详细解答:
-
利用
House of Apple
技术劫持程序流至ROP链。 -
通过
syscall; ret
gadget拼接ORW链。