0CTF 2024 部分WP
字数 1233 2025-08-22 12:22:42

0CTF 2024 Recruitment 题目解析与解题指南

题目概述

题目名为 "Recruitment",要求通过生成特定格式的二维码来满足后端验证条件,最终获取 flag。题目涉及二维码生成、编码验证和 JSON 数据校验。


解题步骤详解

1. 理解题目逻辑
  • 前端流程:用户通过 /apply 路由提交信息,生成二维码。
  • 后端验证/api/submit 路由接收二维码图片,解析后验证内容,通过则返回 flag。
  • 关键验证点
    • check_qrcode():验证二维码的尺寸和特定模块值。
    • check_result():验证解析后的 JSON 数据是否符合要求。
2. 二维码生成与验证
  • 二维码版本选择
    • 尺寸公式:21 + (n-1)*4,题目限制 dimension <= 45(即版本 7)。
    • 使用 QRCodeWriter 生成二维码时需指定版本和纠错级别:
      BitMatrix bitMatrix = writer.encode(inputData, BarcodeFormat.QR_CODE, 300, 300, 
          Map.of(EncodeHintType.QR_VERSION, 7, EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L));
      
  • 特定模块值要求
    • 以下坐标必须为 0(白色模块):
      bit_matrix[8][0] == 0
      bit_matrix[8][1] == 0
      bit_matrix[dimension-1][8] == 0
      bit_matrix[dimension-2][8] == 0
      
    • 解决方法
      1. 生成二维码后,手动修改 BitMatrix 的对应模块:
        bitMatrix.unset(8, 0); // (8, 0)
        bitMatrix.unset(8, 1); // (8, 1)
        bitMatrix.unset(dimension-1, 8); // (dimension-1, 8)
        bitMatrix.unset(dimension-2, 8); // (dimension-2, 8)
        
      2. 或直接生成满足条件的二维码数据字符串,重新构造 BitMatrix
3. JSON 数据验证
  • 必须字段
    {
      "name": "滌滌漾火珈珈豆谷欝欝寵齦齦棧棧",
      "email": "ĄąŁęțÿżÀÁćæçöśű@POD-ASIA.RECRUITMENT.MARS.TECH",
      "phone": "껪껪ㇴㇴㇴ㍂㍂㍂舘舘舘덃덃駱駱駱縷縷縷긭긭ㇼㇼㇼ蘭蘭蘭㍑㍑㍑糧糧糧곀곀뇂뇂뇂㍅㍅㍅㋗㋗㋗懲懲懲궒궒궒",
      "languages": ["Python", "Java", "C", "Go", ...] // 第4个元素不能是 "Python"
    }
    
  • 校验逻辑
    • languages 列表中的语言必须在 PROGRAMMING_LANGUAGES 列表中(如 Python、Java 等)。
    • 第 4 个元素(索引 3)不能是 "Python"。
4. 二维码解析与编码问题
  • 解析工具:题目使用 zxing-test-1.0-SNAPSHOT.jar 解析二维码,生成 JSON 文件。
  • 编码问题
    • 如果解析后 JSON 乱码,需指定 UTF-8 编码:
      hintMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");
      
    • 但需注意 UTF-8 编码可能增加数据长度,需确保二维码尺寸仍满足要求。
5. 完整解题代码示例
  • 生成二维码的 Java 代码
    package org.example;
    import com.google.zxing.*;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.qrcode.QRCodeWriter;
    import com.google.zxing.client.j2se.MatrixToImageWriter;
    import java.io.File;
    import java.util.HashMap;
    import java.util.Map;
    
    public class GenerateQR {
        public static void main(String[] args) throws Exception {
            String inputData = "{\"name\":\"滌滌漾火珈珈豆谷欝欝寵齦齦棧棧\",\"email\":\"ĄąŁęțÿżÀÁćæçöśű@POD-ASIA.RECRUITMENT.MARS.TECH\",\"phone\":\"껪껪ㇴㇴㇴ㍂㍂㍂舘舘舘덃덃駱駱駱縷縷縷긭긭ㇼㇼㇼ蘭蘭蘭㍑㍑㍑糧糧糧곀곀뇂뇂뇂㍅㍅㍅㋗㋗㋗懲懲懲궒궒궒\",\"languages\":[\"Java\",\"C\",\"Go\",\"Python\"]}";
            QRCodeWriter writer = new QRCodeWriter();
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.QR_VERSION, 7);
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    
            BitMatrix bitMatrix = writer.encode(inputData, BarcodeFormat.QR_CODE, 300, 300, hints);
            // 手动修改特定模块
            bitMatrix.unset(8, 0);
            bitMatrix.unset(8, 1);
            bitMatrix.unset(bitMatrix.getWidth()-1, 8);
            bitMatrix.unset(bitMatrix.getWidth()-2, 8);
    
            MatrixToImageWriter.writeToFile(bitMatrix, "PNG", new File("final_qr.png"));
        }
    }
    
6. 验证与提交
  • 使用生成的二维码提交到 /api/submit,确保:
    1. 二维码能被正确解析为 JSON。
    2. JSON 数据完全匹配题目要求。
    3. 二维码尺寸和模块值通过 check_qrcode() 验证。

关键知识点总结

  1. 二维码技术
    • 版本与尺寸关系、纠错级别(L/M/Q/H)。
    • 使用 ZXing 库生成和解析二维码。
  2. 编码问题
    • UTF-8 编码对非 ASCII 字符的处理。
  3. 数据验证
    • 精确匹配 JSON 字段和特定值。
  4. 调试技巧
    • 反编译 JAR 文件分析解析逻辑(如 zxing-test-1.0-SNAPSHOT.jar)。

参考资源

  • ZXing 文档:https://github.com/zxing/zxing
  • 二维码版本尺寸表:https://www.qrcode.com/en/about/version.html
  • 解题参考:https://lape.si/writeups/0ctf/recruitment
0CTF 2024 Recruitment 题目解析与解题指南 题目概述 题目名为 "Recruitment",要求通过生成特定格式的二维码来满足后端验证条件,最终获取 flag。题目涉及二维码生成、编码验证和 JSON 数据校验。 解题步骤详解 1. 理解题目逻辑 前端流程 :用户通过 /apply 路由提交信息,生成二维码。 后端验证 : /api/submit 路由接收二维码图片,解析后验证内容,通过则返回 flag。 关键验证点 : check_qrcode() :验证二维码的尺寸和特定模块值。 check_result() :验证解析后的 JSON 数据是否符合要求。 2. 二维码生成与验证 二维码版本选择 : 尺寸公式: 21 + (n-1)*4 ,题目限制 dimension <= 45 (即版本 7)。 使用 QRCodeWriter 生成二维码时需指定版本和纠错级别: 特定模块值要求 : 以下坐标必须为 0(白色模块): 解决方法 : 生成二维码后,手动修改 BitMatrix 的对应模块: 或直接生成满足条件的二维码数据字符串,重新构造 BitMatrix 。 3. JSON 数据验证 必须字段 : 校验逻辑 : languages 列表中的语言必须在 PROGRAMMING_LANGUAGES 列表中(如 Python、Java 等)。 第 4 个元素(索引 3)不能是 "Python"。 4. 二维码解析与编码问题 解析工具 :题目使用 zxing-test-1.0-SNAPSHOT.jar 解析二维码,生成 JSON 文件。 编码问题 : 如果解析后 JSON 乱码,需指定 UTF-8 编码: 但需注意 UTF-8 编码可能增加数据长度,需确保二维码尺寸仍满足要求。 5. 完整解题代码示例 生成二维码的 Java 代码 : 6. 验证与提交 使用生成的二维码提交到 /api/submit ,确保: 二维码能被正确解析为 JSON。 JSON 数据完全匹配题目要求。 二维码尺寸和模块值通过 check_qrcode() 验证。 关键知识点总结 二维码技术 : 版本与尺寸关系、纠错级别(L/M/Q/H)。 使用 ZXing 库生成和解析二维码。 编码问题 : UTF-8 编码对非 ASCII 字符的处理。 数据验证 : 精确匹配 JSON 字段和特定值。 调试技巧 : 反编译 JAR 文件分析解析逻辑(如 zxing-test-1.0-SNAPSHOT.jar )。 参考资源 ZXing 文档:https://github.com/zxing/zxing 二维码版本尺寸表:https://www.qrcode.com/en/about/version.html 解题参考:https://lape.si/writeups/0ctf/recruitment