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 - 解决方法:
- 生成二维码后,手动修改
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) - 或直接生成满足条件的二维码数据字符串,重新构造
BitMatrix。
- 生成二维码后,手动修改
- 以下坐标必须为 0(白色模块):
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 编码可能增加数据长度,需确保二维码尺寸仍满足要求。
- 如果解析后 JSON 乱码,需指定 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,确保:- 二维码能被正确解析为 JSON。
- JSON 数据完全匹配题目要求。
- 二维码尺寸和模块值通过
check_qrcode()验证。
关键知识点总结
- 二维码技术:
- 版本与尺寸关系、纠错级别(L/M/Q/H)。
- 使用 ZXing 库生成和解析二维码。
- 编码问题:
- UTF-8 编码对非 ASCII 字符的处理。
- 数据验证:
- 精确匹配 JSON 字段和特定值。
- 调试技巧:
- 反编译 JAR 文件分析解析逻辑(如
zxing-test-1.0-SNAPSHOT.jar)。
- 反编译 JAR 文件分析解析逻辑(如
参考资源
- ZXing 文档:https://github.com/zxing/zxing
- 二维码版本尺寸表:https://www.qrcode.com/en/about/version.html
- 解题参考:https://lape.si/writeups/0ctf/recruitment