ISCC2025 CTF WriteUp 汇总
本文记载了部分ISCC2025的题解,主要是个人赛时做出来的内容,也有部分内容是赛后得到的。内容因为过长经过AI总结,可能存在差错,并不代表个人真实WriteUp,仅供参考学习。
Pwn 类别
book_manager
解题思路:
- 连接目标服务器:使用 remote() 函数连接到目标服务器的指定 IP 和端口。
- 定义目标地址:包括 flag 字符串的地址、加载函数地址、以及关键的 ROP gadget 地址(如 pop_rdi_ret 和 ret)。
- 添加书籍函数封装:简化后续代码调用,用于填充堆栈和构造恶意输入。
- 泄露 canary 值:利用搜索名称功能,通过缓冲区溢出泄露栈中的 canary 值。
- 构造 ROP 链:使用泄露的 canary 值和 ROP gadget 构造 ROP 链,调用加载函数读取
/flag
文件内容。 - 填充书籍:添加多个书籍填充堆栈,为后续的栈溢出攻击做准备。
- 添加包含 ROP 链的书籍:构造特殊的书籍,使其作者字段包含 ROP 链。
- 触发栈溢出:使用显示功能选择包含 ROP 链的书籍,触发栈溢出,执行 ROP 链。
- 获取 flag:执行 ROP 链后,读取返回的 flag 并打印。
关键代码:
1 | from pwn import * |
call
解题思路:
- 信息收集:确定目标程序运行的 IP 和端口,以及本地提供的程序和 libc 库文件。
- 漏洞分析:发现程序存在缓冲区大小与输入大小不匹配的漏洞,可能导致覆盖返回地址。
- 泄露 libc 地址:构造 ROP 链调用
write
函数,输出write
函数的 GOT 表项地址,从而泄露 libc 的基地址。 - 计算关键地址:根据泄露的
write
地址计算 libc 基地址,进而确定system
和/bin/sh
的地址。 - 构造 ROP 链:利用泄露的 libc 基地址,构造 ROP 链调用
system("/bin/sh")
以获取 shell。
关键代码:
1 | from pwn import * |
Dilemma
解题思路:
- 连接远程服务:使用 remote() 函数连接到目标服务器。
- 泄露 canary 和 libc 地址:通过格式化字符串漏洞泄露堆栈中的 canary 值以及
__libc_start_main
的地址。 - 计算 libc 基地址:根据
__libc_start_main
的偏移量计算 libc 的基地址。 - 栈迁移攻击:利用
func_0
中的缓冲区溢出漏洞,将控制流迁移到 bss 段。 - 构造 ROP 链:在 bss 段中写入 ROP 链,依次调用
open
、read
和write
函数读取并输出 flag 文件内容。
关键代码:
1 | from pwn import * |
Enc++
解题思路:
- 分析加密流程:通过逆向分析发现程序使用 AES 加密,并且提取了密钥和初始向量。
- 泄露 canary 值:利用格式化字符串漏洞读取栈上的 canary 值。
- 触发执行流劫持:修改全局变量的值进入存在缓冲区溢出的函数。
- 构造 ROP 链:利用 canary 值和 ROP gadget 构造 ROP 链,调用
execve("/bin/sh", 0, 0)
。
关键代码:
1 | from pwn import * |
Fufu
解题思路:
- 信息收集:确定目标程序运行的 IP 和端口。
- 漏洞分析:发现程序存在格式化字符串漏洞和栈溢出漏洞。
- 泄露 canary 和 libc 地址:利用格式化字符串漏洞泄露栈上的 canary 值和
puts
函数的 GOT 地址。 - 计算关键地址:根据泄露的
puts
地址计算 libc 的基地址。 - 构造 ROP 链:利用泄露的 libc 基地址,构造 ROP 链调用
system("/bin/sh")
以获取 shell。
关键代码:
1 | from pwn import * |
mini pwn
解题思路:
- 连接远程服务:使用 remote() 函数连接到目标服务器。
- 构造虚拟机指令:构造特定的虚拟机指令序列,覆盖虚拟机状态存储区域。
- 泄露 canary 和 libc 地址:通过指令泄露 canary 值和 libc 地址。
- 构造 ROP 链:利用泄露的信息构造 ROP 链,调用
execve("/bin/sh", 0, 0)
。
关键代码:
1 | from pwn import * |
mutilsumi
解题思路:
- 分析程序功能:程序通过输入用户数据创建和管理书籍。
- 发现漏洞:存在缓冲区溢出漏洞,允许用户输入超过缓冲区大小的数据。
- 泄露 canary:利用搜索功能,通过缓冲区溢出泄露栈中的 canary 值。
- 构造 ROP 链:使用泄露的 canary 值和 ROP gadget 构造 ROP 链,调用
execve("/bin/sh", 0, 0)
。 - 堆喷射:通过多次添加书籍填充堆栈,为后续的栈溢出攻击做准备。
- 触发栈溢出:使用显示功能选择包含 ROP 链的书籍,触发栈溢出,执行 ROP 链。
关键代码:
1 | from pwn import * |
program
解题思路:
- 泄露 libc 地址:通过连续创建和释放堆块,利用 tcache 泄露 main_arena 地址,进而计算 libc 基地址。
- 重建内存布局:通过特定顺序的堆操作,构造重叠堆块,利用 tcache 的 FILO 特性制造多指针指向同一内存区域。
- 劫持内存指针:通过修改 tcache 链表的 fd 指针,将目标地址
__free_hook
插入分配链。 - 获取特权内存:通过三次连续分配操作,使分配器返回
__free_hook
的存储位置,实现内存写入权限获取。 - 触发命令执行:向
__free_hook
写入system
函数地址,同时在可控堆块中植入/bin/sh
命令字符串,触发删除操作时执行system("/bin/sh")
。
关键代码:
1 | from pwn import * |
vm_pwn
解题思路:
- 连接远程服务:使用 remote() 函数连接到目标服务器。
- 定义指令和 gadget:包括加载立即数、间接加载、存储、移动寄存器、推入和弹出栈等指令。
- 构造 ROP 链:利用泄露的 libc 地址,调用
open
、read
和write
函数读取并输出 flag 文件内容。
关键代码:
1 | from pwn import * |
Reverse 类别
CrackMe
解题思路:
- 提取加密数据:使用 IDA 或其他逆向工具提取程序中的加密字符串。
- 提取解密数组:找到程序中的解密数组。
- 异或操作:将加密数据与解密数组进行逐项异或操作。
- 字符映射转换:根据程序中的映射表,将中间解密结果转换为最终字符。
关键代码:
1 | from ida_bytes import * |
HolyGrail
解题思路:
- 动态分析:使用 jadx 工具对目标程序进行逆向分析,精准定位至主函数所在路径。
- 提取密文:从程序中提取加密的密文信息。
- 动态调试:使用动态调试工具如 x64dbg 或 IDA Pro,跟踪加密函数的调用过程。
- 分析加密逻辑:发现程序使用了维吉尼亚(Vigenère)加密算法,并提取密钥。
- 构建解密脚本:使用 Frida 工具创建钩子函数,拦截加密函数调用,记录参数和返回值。
- 自定义编码方案:根据程序中的自定义编码方案,将解密后的数据转换为可读字符。
关键代码:
1 | import itertools |
SecretGrid
解题思路:
- 分析程序:通过 IDA 或其他逆向工具分析程序,发现程序中存在一个
printflag
函数。 - 定位密文:在程序中找到加密的字符串存储位置。
- 提取密文和密钥:提取加密字符串和解密密钥。
- 解密操作:对加密字符串进行异或操作,并再次与 0x73 进行异或,获取中间解密结果。
- 字符映射:根据程序中的映射表,将中间解密结果转换为最终字符。
关键代码:
1 | from ida_bytes import * |
uglyCpp
解题思路:
- 逆向分析:使用 IDA 或其他逆向工具分析程序,提取出加密后的数据和解密密钥。
- 异或操作:将提取出的加密数据与密钥进行逐项异或操作。
- 字符映射转换:根据自定义的字符映射表,将异或后的结果转换为最终字符。
关键代码:
1 | v = [1402995999, -1804867724, -1684076187, -708415294, 1697943426, 704842934, 1657972338, -594299211, 63671599] |
Mobile 类别
Detective
解题思路:
- 分析应用:使用 jadx 工具对 APK 文件进行逆向分析,发现关键的 JNI 函数和本地库文件。
- 定位密文:在本地库文件中找到加密的 flag 数据。
- 绕过保护机制:通过修改 SO 文件中的调试检测函数,绕过调试尝试。
- 动态分析:使用 Unidbg 工具模拟应用运行环境,拦截关键函数调用,提取解密后的 flag。
关键代码:
1 | // 使用十六进制编辑器修补 SO 文件 |
GGAD
解题思路:
- 分析应用结构:使用 jadx 工具对 APK 文件进行逆向分析,识别出关键的加密逻辑。
- 提取密文和密钥:从程序中提取加密后的数据和密钥。
- 修改 TEA 算法:根据程序中的修改版 TEA 算法,手动实现解密过程。
- 时间戳计算:根据题目提示,计算出最大时间戳。
- 解密获取 flag:使用计算出的时间戳生成 S 盒,完成解密过程。
关键代码:
1 |
|
Vmobile
解题思路:
- 分析应用:使用 jadx 工具对 APK 文件进行逆向分析,发现程序中存在修改版 TEA 加密算法。
- 定位密文和密钥:从程序中提取加密数据和密钥。
- 逆向 TEA 算法:根据修改的 TEA 算法,手动实现解密过程。
- 绕过保护机制:通过修改 SO 文件中的调试检测函数,绕过调试尝试。
- 使用 Unidbg 进行动态分析:拦截关键函数调用,提取解密后的 flag。
关键代码:
1 |
|
时间尽头
解题思路:
- 分析应用:使用 jadx 工具对 APK 文件进行逆向分析,发现程序中存在 AES 加密逻辑。
- 提取密文和密钥:从程序中提取加密数据和密钥。
- 去除花指令:使用 idapython 脚本去除 SO 文件中的花指令,简化分析。
- 提取时间戳:根据题目提示,生成最大时间戳。
- 解密获取 flag:使用生成的时间戳生成 S 盒,完成 AES 解密过程。
关键代码:
1 | from ida_bytes import * |
睡美人
解题思路:
- 分析图像文件:使用 binwalk 工具分析图像文件,发现嵌入的 ZIP 压缩包。
- 提取压缩包:使用 binwalk 或 foremost 工具提取 ZIP 压缩包。
- 解压并分析:解压提取的 ZIP 文件,发现曼切斯特编码的音频文件。
- 手动提取曼切斯特编码:由于没有找到自动化工具,手动提取音频数据。
关键代码:
1 | # 使用 binwalk 分析图像文件 |
Web 类别
ISCC购物中心
解题思路:
- 分析网站:发现前端存在积分兑换逻辑,且用户拥有大量积分。
- 绕过兑换流程:通过修改前端代码或直接发送请求绕过正常兑换流程。
- 获取 flag:获取 flag 的具体过程未详细描述,但通常涉及进一步的漏洞利用或逻辑绕过。
关键代码:
1 | from pwn import * |
ShallowSeek
解题思路:
- 访问提示页面:根据提示信息访问特定路径,获取进一步线索。
- 分析提示内容:发现提示涉及特定文件和 AJAX 请求头。
- 发送请求:模拟 AJAX 请求访问受保护资源。
- 获取 flag:通过发送特定请求获取 flag 的前半部分和后半部分。
关键代码:
1 | import requests |
命令执行器
解题思路:
- 信息收集:确定目标程序运行的 IP 和端口。
- 漏洞分析:发现程序存在格式化字符串漏洞和栈溢出漏洞。
- 泄露 canary 和 libc 地址:利用格式化字符串漏洞泄露栈上的 canary 值和
puts
函数的 GOT 地址。 - 计算关键地址:根据泄露的
puts
地址计算 libc 的基地址。 - 构造 ROP 链:利用泄露的 libc 基地址,构造 ROP 链调用
system("/bin/sh")
以获取 shell。
关键代码:
1 | from pwn import * |
谁动了我的奶酪
解题思路:
- 枚举文件:使用 dirsearch 工具枚举常见文件路径,发现隐藏的
flag_of_cheese.php
。 - 绕过限制:通过构造特定的请求下载
flag_of_cheese.php
文件。 - 分析代码:发现代码中存在 JWT 签名绕过和目录遍历漏洞。
- 获取 flag:通过发送特定请求访问受保护的
flag
文件。
关键代码:
1 | import requests |
Misc 类别
八卦
解题思路:
- 分析附件:附件为一个 GIF 文件,包含 10 个分块。
- 转为十六进制:使用十六进制编辑器将文件转为十六进制格式。
- 提取二进制字符串:将每个字符转换为 8 位二进制表示,去除前导零。
- 处理填充字符:移除每隔两位插入的额外 “00”。
- 还原字节顺序:将每组 8 位二进制字符串转换为字节。
- 位翻转:对字节进行位翻转操作(0→1,1→0)。
- 转换为 ASCII:将处理后的二进制字符串转换为 ASCII 字符。
关键代码:
1 | with open('_256eb5ec016236.jpg','rb') as f1, open('flag.png','wb') as f2: |
迷途之子
解题思路:
- 提取迷宫数据:使用 Ida 软件提取迷宫数据并保存到文件。
- BFS 算法求解:实现广度优先搜索(BFS)算法,从起点到终点寻找路径。
- 游戏堆内存利用:利用 game() 函数中的堆喷射技术,覆盖关键指针,劫持内存分配器指针。
- 构造 ROP 链:在 bss 段中写入 ROP 链,调用
open
、read
和write
函数读取并输出 flag 文件内容。
关键代码:
1 | from collections import deque |
神经网络迷踪
解题思路:
- 提取张量数据:从模型文件中提取张量数据。
- 转换为字节流:将张量数据转换为字节流。
- 解码为字符串:将字节流解码为 UTF-8 字符串。
关键代码:
1 | import torch |
正正得负
解题思路:
- 分析 ZIP 文件:发现 ZIP 文件采用 ZipCrypto Store 加密方式。
- 明文攻击:利用已知文件名作为明文信息,使用 bkcrack 工具进行明文攻击,解密 ZIP 文件。
- 提取 flag:解密后的 ZIP 文件中包含 flag。
关键代码:
1 | # 创建包含 "flag.txt" 的文件 |
- 本文作者: 黎玮
- 本文链接: https://lwow.xyz/2025/05/30/ISCC2025WriteUp/
- 版权声明: © William-Liwei. All rights reserved.