题目信息

题目信息

解题步骤

DIE分析

IDA 分析后,第一步在 main 函数中

main函数

我们接下来跟进main_0

main_0

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
// 程序入口函数,标准main函数格式
int __cdecl main_0(int argc, const char **argv, const char **envp)
{
char v4[4]; // 用于存储用户输入的字符(实际只用v4[0])
const char *v5; // 字符串指针,用于存储疑似flag
int v6; // 倒计时计数器

v6 = 5; // 初始化倒计时从5开始
v5 = "DBAPP{49d3c93df25caad81232130f3d2ebfad}"; // 硬编码的flag

// 倒计时循环:5,4,3,2,1,0 共6次
while (v6 >= 0)
{
printf(&byte_4250EC, v6); // 打印倒计时提示(byte_4250EC是"距离出现答案还有%d秒,请耐心等待!")
sub_40100A(); // 辅助函数(可能是延迟/sleep或清屏操作)
--v6; // 计数器减1
}

printf(asc_425088); // 打印交互提示(asc_425088 这里本来应该是答案的,但是粗心的程序员忘记把变量写进来了,你要不逆向试试看:(Y/N))
v4[0] = 1; // 初始化输入缓冲区(实际无用,会被scanf覆盖)
scanf("%c", v4); // 获取用户输入的单个字符

// 处理用户输入
if (v4[0] == 89) // 'Y'的ASCII码是89
{
printf(aOd); // 打印确认消息(aOd可能是"Confirmed!")
return sub_40100A(); // 调用辅助函数后退出
}
else
{
if (v4[0] == 78) // 'N'的ASCII码是78
printf(&byte_425034); // 打印&byte_425034 那没办法了,猜是猜不出的.
else
printf(&byte_42501C); // 打印&byte_42501C 输入错误,没有提示.
return sub_40100A(); // 调用辅助函数后退出
}
}

byte-4250EC

1
BE E0 C0 EB B3 F6 CF D6 B4 F0 B0 B8 BB B9 D3 D0 25 64 C3 EB A3 AC C7 EB C4 CD D0 C4 B5 C8 B4 FD A3 A1 0A
1
2
3
gbk_bytes = bytes.fromhex("BE E0 C0 EB B3 F6 CF D6 B4 F0 B0 B8 BB B9 D3 D0 25 64 C3 EB A3 AC C7 EB C4 CD D0 C4 B5 C8 B4 FD A3 A1 0A")
decoded_str = gbk_bytes.decode('gbk')
print(f"byte_4250EC: {decoded_str}")

byte_425034

1
C4 C7 C3 BB B0 EC B7 A8 C1 CB A3 AC B2 C2 CA C7 B2 C2 B2 BB B3 F6 B5 C4 A3 AE

byte_42501C

1
CA E4 C8 EB B4 ED CE F3 2C C3 BB D3 D0 CC E1 CA BE 2E

image-20251026212107227

实际上,flag一直在“头上”

v5 = "DBAPP{49d3c93df25caad81232130f3d2ebfad}"; // 硬编码的flag

flag{49d3c93df25caad81232130f3d2ebfad}