CTFShow-西瓜杯-你是我的眼

CTFShow-西瓜杯-你是我的眼

1. 工具准备与运行

本题需使用jadx-gui(Java反编译工具)分析题目代码,具体操作步骤如下:

  1. 提前安装jadx-gui工具(版本1.4.4及以上);
  2. 进入工具的lib目录;
  3. 执行以下命令启动jadx-gui
    1
    java -jar jadx-gui-1.4.4.jar
  4. 将下载的题目文件导入jadx-gui中,即可查看反编译后的Java代码。

2. 题目代码分析

导入后得到的核心代码如下,需重点分析编码逻辑flag校验逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class Main {
// 定义4个字符串片段,拼接后为Base64编码前的完整字符串
private static final String PART1 = "U2NF9CSUFOTUF9";
private static final String PART2 = "Xw-";
private static final String PART3 = "Q1RGU2hvd3tURVNUX0";
private static final String PART4 = "JBU0";

/**
* 自定义解码方法:处理Base64的URL安全格式
* 逻辑:将URL安全Base64中的 '-' 替换为 '+','_' 替换为 '/',再进行标准Base64解码
*/
public static String customDecode(String input) {
String standardInput = input.replace('-', '+').replace('_', '/');
return new String(Base64.getDecoder().decode(standardInput));
}

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入FLAG:");
String userInput = scanner.nextLine();

// 对目标字符串进行自定义解码,得到正确flag
String decodedFlag = customDecode("Q1RGU2hvd3tURVNUX0JBU0U2NF9CSUFOTUF9Xw-");

// 清洗用户输入:移除 '_' 和 不可见字符 '\u000f'
String cleanInput = userInput.replace("_", "").replace("\u000f", "");

// 校验清洗后的用户输入与解码后的正确flag是否一致
if (checkflag(cleanInput, decodedFlag)) {
System.out.println("flag正确");
} else {
System.out.println("输入错误");
}
scanner.close();
}

/**
* flag校验方法:同样清洗正确flag(移除 '_' 和 '\u000f'),再与用户输入对比
*/
private static boolean checkflag(String input, String CTFflag) {
return CTFflag.replace("_", "").replace("\u000f", "").equals(input);
}
}

3. 解题步骤

根据代码逻辑,解题核心是对customDecode方法的目标字符串进行解码,步骤如下:

  1. 提取目标编码字符串:从main方法中找到customDecode的入参——Q1RGU2hvd3tURVNUX0JBU0U2NF9CSUFOTUF9Xw-
  2. 处理URL安全Base64格式:按照customDecode逻辑,将字符串中的-替换为+,得到处理后的字符串:Q1RGU2hvd3tURVNUX0JBU0U2NF9CSUFOTUF9Xw+
  3. 执行标准Base64解码:使用Base64解码工具(如在线Base64解码器、Python的base64库等)对处理后的字符串解码;
  4. 得到正确flag:解码结果即为题目要求的flag。

4. 解码结果与验证

  • 解码过程示意
    目标编码串:Q1RGU2hvd3tURVNUX0JBU0U2NF9CSUFOTUF9Xw-
    处理后编码串:Q1RGU2hvd3tURVNUX0JBU0U2NF9CSUFOTUF9Xw+
    Base64解码结果:CTFShow{TEST_BASE64_BIANMA}

  • 验证:若用户输入CTFShow{TEST_BASE64_BIANMA},经cleanInput清洗后与decodedFlag清洗结果一致,会输出“flag正确”。

(解码结果可通过下图验证,对应原文档中的解码界面)