暴力通关,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 解题方法

  1. 使用目录扫描工具扫描网站
  2. 检查robots.txt文件
  3. 在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 完整解密流程

  1. 对密文进行逐字节异或还原
  2. 使用自定义Base64表解码
  3. 输出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 关键实现细节

  1. 网格坐标计算:将网格编号转换为屏幕坐标
  2. 剪枝优化:使用visited集合避免重复访问
  3. 异常处理:确保脚本在出错时能继续运行
  4. 信息提取:从游戏返回文本中解析新key和网格

4.2.4 脚本工作流程

  1. 从起始网格和key开始
  2. 自动点击网格并输入key
  3. 捕获游戏返回信息
  4. 解析新key和网格
  5. 将未访问的网格加入队列
  6. 重复直到找到flag

5. 总结与启示

5.1 创新点

  1. 突破传统逆向思维,使用自动化工具暴力解题
  2. 结合GUI自动化与逆向分析
  3. 适用于游戏类、交互类逆向题目

5.2 适用场景

  • 游戏机制复杂的逆向题目
  • 算法逆向困难的场景
  • 交互式题目

5.3 注意事项

  1. 需要精确计算UI元素位置
  2. 要处理各种异常情况
  3. 可能需要调整延迟时间以适应不同系统
  4. 剪枝优化对性能至关重要

5.4 扩展应用

这种方法可以应用于:

  • 自动化测试游戏漏洞
  • 解决其他GUI交互类挑战
  • 自动化重复性GUI操作任务

6. 附录

6.1 相关工具

  • PyAutoGUI:GUI自动化库
  • pywinauto:Windows UI自动化库
  • OCR工具:备用方案(虽然本文未采用)

6.2 参考资源

  • PyAutoGUI官方文档
  • CTF逆向工程技巧
  • 游戏自动化测试方法

通过本文介绍的方法,CTF选手可以扩展解题思路,在面对特定类型的逆向题目时,能够灵活选择最有效的解决方案。

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实现 3.3 解密过程详解 3.3.1 异或解密 3.3.2 自定义Base64解码 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 解题脚本详解 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选手可以扩展解题思路,在面对特定类型的逆向题目时,能够灵活选择最有效的解决方案。