TGCTF-pwn复现
字数 1474 2025-08-30 06:50:35
TGCTF Pwn题目复现与分析
1. 签到题 (gets函数栈溢出)
漏洞分析
- 使用不安全的
gets函数导致栈溢出 - 无PIE保护,可直接利用
利用方法
- 采用ret2libc技术
- 步骤:
- 泄露libc基地址
- 计算system和/bin/sh地址
- 构造ROP链执行system("/bin/sh")
关键点
- 需要先泄露libc地址
- 计算正确的偏移量
- 构造正确的ROP链布局
2. fmt (格式化字符串漏洞)
漏洞分析
- 存在格式化字符串漏洞
- 提供了栈地址
- 只有一次利用机会
利用方法
- 第一次利用:
- 修改printf返回地址为0x40123d
- 泄露libc基地址
- 后续利用:
- 将返回地址改为one_gadget
关键点
- 利用格式化字符串修改返回地址
- 实现漏洞的重复利用
- 准确计算one_gadget偏移
3. overflow (栈迁移技术)
漏洞分析
- 程序会跳转到ecx-4指向的地址
- 栈内容可以弹到rcx寄存器
- 静态编译,无ASLR
利用方法
- 利用栈迁移技术:
- 控制ecx寄存器
- 将控制流转移到可控区域
- 调用mprotect修改bss段权限为7(可读可写可执行)
- 执行放置在bss段的shellcode
关键点
- 理解栈迁移原理
- 正确计算ecx-4的偏移
- 正确设置mprotect参数
4. stack (系统调用利用)
漏洞分析
- 检查程序返回地址
- 若不同则跳转到0x4011b6
- 0x4011b6处可通过0x4040a0控制寄存器
利用方法
- 覆盖0x4040a0处的值
- 构造execve系统调用:
- "/bin/sh\x00"字符串
- 设置rdi, rsi, rdx寄存器
- 设置rax为59(execve系统调用号)
关键点
- 理解系统调用机制
- 正确设置寄存器值
- 构造完整的参数链
5. shellcode (短shellcode编写)
题目限制
- shellcode长度不超过0x12字节(18字节)
解决方案
- 编写极简shellcode
- 可使用:
xor rsi, rsi push rsi mov rdi, 0x68732f2f6e69622f push rdi push rsp pop rdi push 59 pop rax cdq syscall
关键点
- 优化shellcode长度
- 确保功能完整
- 适应题目空间限制
6. heap (UAF漏洞利用)
漏洞分析
- glibc 2.23版本
- 菜单题,存在Use-after-Free漏洞
- 无show函数,但edit可以输出
- 可泄露libc地址
利用方法
- 利用fastbin attack泄露libc
- 修改malloc_hook为one_gadget
- 通常写malloc_hook-0x23处
- 触发malloc获取shell
关键点
- 理解UAF原理
- 掌握fastbin attack技术
- 准确计算malloc_hook偏移
7. noret (JOP技术)
漏洞分析
- 类似ROP的JOP(Jmp Oriented Programming)技术
- 需要布置栈空间
利用方法
- 寻找合适的jmp指令片段(gadget)
- 布置栈空间控制程序流
- 链式跳转实现完整利用
关键点
- 理解JOP与ROP的区别
- 寻找有效的jmp gadget
- 正确布置栈结构
通用技巧总结
-
信息泄露:
- 通过格式化字符串、UAF、堆溢出等方式泄露关键地址
- 计算libc基地址
-
控制流劫持:
- 覆盖返回地址
- 修改函数指针
- 劫持虚表等
-
防护绕过:
- 针对NX:使用ROP/JOP或mprotect
- 针对ASLR:先泄露地址
- 针对Canary:泄露或覆盖
-
利用构造:
- 根据题目限制选择合适的利用方式
- 考虑shellcode长度限制
- 适应不同的保护机制
-
调试技巧:
- 使用gdb+pwndbg调试
- 观察内存布局变化
- 验证利用链的正确性