TGCTF-pwn复现
字数 1474 2025-08-30 06:50:35

TGCTF Pwn题目复现与分析

1. 签到题 (gets函数栈溢出)

漏洞分析

  • 使用不安全的gets函数导致栈溢出
  • 无PIE保护,可直接利用

利用方法

  • 采用ret2libc技术
  • 步骤:
    1. 泄露libc基地址
    2. 计算system和/bin/sh地址
    3. 构造ROP链执行system("/bin/sh")

关键点

  • 需要先泄露libc地址
  • 计算正确的偏移量
  • 构造正确的ROP链布局

2. fmt (格式化字符串漏洞)

漏洞分析

  • 存在格式化字符串漏洞
  • 提供了栈地址
  • 只有一次利用机会

利用方法

  1. 第一次利用:
    • 修改printf返回地址为0x40123d
    • 泄露libc基地址
  2. 后续利用:
    • 将返回地址改为one_gadget

关键点

  • 利用格式化字符串修改返回地址
  • 实现漏洞的重复利用
  • 准确计算one_gadget偏移

3. overflow (栈迁移技术)

漏洞分析

  • 程序会跳转到ecx-4指向的地址
  • 栈内容可以弹到rcx寄存器
  • 静态编译,无ASLR

利用方法

  1. 利用栈迁移技术:
    • 控制ecx寄存器
    • 将控制流转移到可控区域
  2. 调用mprotect修改bss段权限为7(可读可写可执行)
  3. 执行放置在bss段的shellcode

关键点

  • 理解栈迁移原理
  • 正确计算ecx-4的偏移
  • 正确设置mprotect参数

4. stack (系统调用利用)

漏洞分析

  • 检查程序返回地址
  • 若不同则跳转到0x4011b6
  • 0x4011b6处可通过0x4040a0控制寄存器

利用方法

  1. 覆盖0x4040a0处的值
  2. 构造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地址

利用方法

  1. 利用fastbin attack泄露libc
  2. 修改malloc_hook为one_gadget
    • 通常写malloc_hook-0x23处
  3. 触发malloc获取shell

关键点

  • 理解UAF原理
  • 掌握fastbin attack技术
  • 准确计算malloc_hook偏移

7. noret (JOP技术)

漏洞分析

  • 类似ROP的JOP(Jmp Oriented Programming)技术
  • 需要布置栈空间

利用方法

  1. 寻找合适的jmp指令片段(gadget)
  2. 布置栈空间控制程序流
  3. 链式跳转实现完整利用

关键点

  • 理解JOP与ROP的区别
  • 寻找有效的jmp gadget
  • 正确布置栈结构

通用技巧总结

  1. 信息泄露

    • 通过格式化字符串、UAF、堆溢出等方式泄露关键地址
    • 计算libc基地址
  2. 控制流劫持

    • 覆盖返回地址
    • 修改函数指针
    • 劫持虚表等
  3. 防护绕过

    • 针对NX:使用ROP/JOP或mprotect
    • 针对ASLR:先泄露地址
    • 针对Canary:泄露或覆盖
  4. 利用构造

    • 根据题目限制选择合适的利用方式
    • 考虑shellcode长度限制
    • 适应不同的保护机制
  5. 调试技巧

    • 使用gdb+pwndbg调试
    • 观察内存布局变化
    • 验证利用链的正确性
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 可使用: 关键点 优化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调试 观察内存布局变化 验证利用链的正确性