暴力通关,PyAutoGUI解re游戏题——DASCTF2024最后一战RE部分题解
字数 1216 2025-08-22 12:22:42
PyAutoGUI在CTF逆向解题中的创新应用
1. 前言
本文基于DASCTF2024最后一战RE部分的解题实践,介绍了一种新颖的逆向解题思路——使用PyAutoGUI自动化工具暴力通关游戏类逆向题目。这种方法突破了传统逆向分析的局限,为CTF解题提供了新的视角。
2. CHECKIN题目解析
2.1 题目特点
- 表面是RE题目,实际是Web签到题
- 解题关键点隐藏在robots.txt文件中
2.2 解题方法
- 使用目录扫描工具扫描网站
- 检查robots.txt文件
- 在robots.txt中找到flag
3. tryre题目深入分析
3.1 题目加密机制
- 基于Base64的魔改加密
- 包含两个主要加密步骤:
- 自定义Base64编码
- 逐字节异或加密
3.2 自定义Base64实现
custom_base64 = "ZYXABCDEFGHIJKLMNOPQRSTUVWzyxabcdefghijklmnopqrstuvw0123456789+/"
reverse_base64 = {char: idx for idx, char in enumerate(custom_base64)}
3.3 解密过程详解
3.3.1 异或解密
def xor_decrypt(data, key=2):
return ''.join(chr(ord(char) ^ key) for char in data)
3.3.2 自定义Base64解码
def custom_base64_decode(data):
decoded_bytes = []
for i in range(0, len(data), 4):
chunk = data[i:i + 4]
padding = chunk.count('=')
chunk = chunk.replace('=', 'A') # 临时替换填充字符
# 解码四个字符为三个字节
b1 = reverse_base64[chunk[0]] << 2 | reverse_base64[chunk[1]] >> 4
b2 = (reverse_base64[chunk[1]] & 0xF) << 4 | reverse_base64[chunk[2]] >> 2
b3 = (reverse_base64[chunk[2]] & 0x3) << 6 | reverse_base64[chunk[3]]
decoded_bytes.extend([b1, b2, b3])
if padding > 0:
decoded_bytes = decoded_bytes[:-padding]
return bytes(decoded_bytes)
3.3.3 完整解密流程
- 对密文进行逐字节异或还原
- 使用自定义Base64表解码
- 输出UTF-8格式的明文
4. secret_of_inkey题目创新解法
4.1 题目特点
- 游戏类逆向题目
- 每个格子需要特定key解锁
- 每个格子可能返回4个新key(可能有重复)
- 传统解法需要逆向分析算法
4.2 PyAutoGUI自动化解法
4.2.1 PyAutoGUI简介
PyAutoGUI是一个强大的GUI自动化库,可以:
- 控制鼠标和键盘
- 自动化各种计算机交互任务
- 简化复杂工作流程
4.2.2 解题脚本详解
import pyautogui
import time
from pywinauto.application import Application
# 初始化参数
print("脚本将在3秒后开始运行...")
time.sleep(3)
# 定义游戏区域坐标
start_x, start_y, end_x, end_y = 900, 210, 2080, 1390
# 初始化网格和key队列
grid = []
key = []
grid.append(565) # 起始网格
key.append('9fc82e15d9de6ef2') # 起始key
# 记录已访问的网格位置,防止重复访问
visited = set()
visited.add(565)
while len(grid):
current_grid = grid.pop()
current_key = key.pop()
# 计算网格中心坐标并点击
grid_x = start_x + 38 * (current_grid % 31) + 5
grid_y = start_y + 38 * (current_grid // 31) + 16
pyautogui.click(grid_x, grid_y)
time.sleep(0.3)
# 输入key并确认
pyautogui.typewrite(current_key + '\n')
time.sleep(0.3)
try:
# 连接游戏窗口并获取返回信息
app = Application(backend="uia").connect(title="Right!")
dialog = app.window(title="Right!")
static_text = dialog.child_window(control_type="Text")
text = static_text.window_text()
except Exception as e:
print(f"无法连接到窗口: {e}")
continue
pyautogui.typewrite('\n') # 确认对话框
print(text)
# 检查是否找到flag
if 'true' in text.lower():
break
if 'nothing' in text.lower():
continue
# 解析返回的新key和网格
t = text.split('\n')
print(t)
# 处理最多4个新key
for i in range(min(4, len(t))):
try:
new_key = t[i][-17:-1] # 提取key
new_grid = int(t[i][7:10]) # 提取网格编号
if new_grid not in visited:
key.append(new_key)
grid.append(new_grid)
visited.add(new_grid) # 标记为已访问
except (ValueError, IndexError) as e:
print(f"解析第 {i} 行时出错: {e}")
continue
print("当前已访问的网格数量:", len(visited))
print("待处理的key:", key)
print("待处理的grid:", grid)
4.2.3 关键实现细节
- 网格坐标计算:将网格编号转换为屏幕坐标
- 剪枝优化:使用visited集合避免重复访问
- 异常处理:确保脚本在出错时能继续运行
- 信息提取:从游戏返回文本中解析新key和网格
4.2.4 脚本工作流程
- 从起始网格和key开始
- 自动点击网格并输入key
- 捕获游戏返回信息
- 解析新key和网格
- 将未访问的网格加入队列
- 重复直到找到flag
5. 总结与启示
5.1 创新点
- 突破传统逆向思维,使用自动化工具暴力解题
- 结合GUI自动化与逆向分析
- 适用于游戏类、交互类逆向题目
5.2 适用场景
- 游戏机制复杂的逆向题目
- 算法逆向困难的场景
- 交互式题目
5.3 注意事项
- 需要精确计算UI元素位置
- 要处理各种异常情况
- 可能需要调整延迟时间以适应不同系统
- 剪枝优化对性能至关重要
5.4 扩展应用
这种方法可以应用于:
- 自动化测试游戏漏洞
- 解决其他GUI交互类挑战
- 自动化重复性GUI操作任务
6. 附录
6.1 相关工具
- PyAutoGUI:GUI自动化库
- pywinauto:Windows UI自动化库
- OCR工具:备用方案(虽然本文未采用)
6.2 参考资源
- PyAutoGUI官方文档
- CTF逆向工程技巧
- 游戏自动化测试方法
通过本文介绍的方法,CTF选手可以扩展解题思路,在面对特定类型的逆向题目时,能够灵活选择最有效的解决方案。