解题领红包之二 {Windows 初级题}
PS:看了大神们的解题思路,真的是受益匪浅,自己往年也参加,基础知识不扎实,就是图个开心娱乐,今年大模型大爆发,切实能感觉到是真的从和大模型对话,进化到了下指令直接干活的地步了!!
最后,还是觉得,自身硬才是硬道理,希望坛友们,有时间多打牢基础知识。
TRAE-CN GLM-5.0
新建个文件夹,拖入程序包,修改个英文名称(crackme.exe),然后输入指令:这是一个解谜程序,请帮我找出正确的flag,并生成报告。
然后点击一下优化指令,OK!(大模型一定要选对,最新的推理模型真的很强!)
然后,IDE就开始苦吃苦吃工作了,得有半个小时吧,中间有些高危操作需要自己动手点击确认一下,直接都白名单自动执行。然后。。。然后就给我正确的flag,我都惊呆了!研究了两天,又是IDA,又是x32dbg,学习不精,看不太懂指令,结果。。。大模型就这么水灵灵的给我答案了。。。
生成报告
CrackMe Challenge v2.5 - 2026 逆向分析报告
一、文件基本信息
| 属性 |
值 |
| 文件名 |
crackme.exe |
| 文件大小 |
939,520 字节 |
| 文件类型 |
PE32 可执行文件 (Windows GUI) |
| 架构 |
x86 (32位) |
| 编译器 |
MinGW-w64 (GCC) |
| 入口点 |
0x004014C0 |
| 镜像基址 |
0x00400000 |
节区信息
| 节名 |
虚拟地址 |
虚拟大小 |
原始大小 |
| .text |
0x001000 |
0xCF944 |
0xCFA00 |
| .data |
0xD1000 |
0x1B0C |
0x1C00 |
| .rdata |
0xD3000 |
0xB08C |
0xB200 |
| .bss |
0xDF000 |
0xD98 |
0x0 |
| .idata |
0xE0000 |
0xFE8 |
0x1000 |
| .CRT |
0xE1000 |
0x38 |
0x200 |
| .tls |
0xE2000 |
0x8 |
0x200 |
| .rsrc |
0xE3000 |
0x4E8 |
0x600 |
| .reloc |
0xE4000 |
0x6EAC |
0x7000 |
二、静态分析
2.1 字符串提取
通过字符串提取发现关键信息:
Keywords: 52pojie, 2026, Happy new year
Hint: Fake flag; length is key
[?] Enter the password:
[!] Hint: The length is your first real challenge.
[+] Correct flag:
[!] Checksum failed! Something is wrong...
[!] Expected: 44709, Got: ...
[X] Wrong password. Keep trying!
2.2 假Flag识别
程序中包含两个明显的"假"flag字符串:
52pojie_2026_HappyNewYear (25字符)
52pojie2026Happy (16字符)
提示信息明确指出:"Fake flag; length is key"
三、动态分析
3.1 密码长度探测
通过测试不同长度的密码,发现:
| 密码长度 |
程序响应 |
| 1-30 |
"Hint: The length is your first real challenge." |
| 31 |
"Wrong password. Keep trying!" |
| 32+ |
"Hint: The length is your first real challenge." |
结论:正确密码长度必须为31字符
3.2 校验和分析
程序显示期望校验和为 44709,这为后续分析提供了重要线索。
四、反汇编分析
4.1 关键函数定位
使用Capstone反汇编引擎分析代码,在地址 0x00401620 发现flag解密函数:
0x401620: sub esp, 0x20
0x401623: mov eax, 0x3023
0x401628: mov edx, dword ptr [esp + 0x24]
0x40162c: mov dword ptr [edx], 0x2d327077 ; 加密数据
0x401632: lea ecx, [edx + 0x1f]
0x401635: mov dword ptr [edx + 4], 0x63272b28 ; 加密数据
0x40163c: mov dword ptr [edx + 8], 0x701d6363 ; 加密数据
0x401643: mov dword ptr [edx + 0xc], 0x1d747072 ; 加密数据
0x40164a: mov dword ptr [edx + 0x10], 0x3232230a ; 加密数据
0x401651: mov dword ptr [edx + 0x14], 0x272c1d3b ; 加密数据
0x401658: mov dword ptr [edx + 0x18], 0x273b1d35 ; 加密数据
0x40165f: mov byte ptr [edx + 0x1e], 0x63
0x401663: mov word ptr [edx + 0x1c], ax ; 0x3023
0x401667: mov eax, edx
0x401669: lea esi, [esi]
0x401670: xor byte ptr [eax], 0x42 ; XOR解密,密钥=0x42
0x401673: add eax, 1
0x401676: cmp eax, ecx
0x401678: jne 0x401670
0x40167a: mov byte ptr [edx + 0x1f], 0 ; 字符串结束符
4.2 校验和计算函数
在地址 0x00401690 发现校验和计算函数:
0x401690: push ebx
0x401691: mov ebx, dword ptr [esp + 8] ; 输入字符串指针
0x401695: movzx eax, byte ptr [ebx]
0x401698: test al, al
0x40169a: je 0x4016c0 ; 空字符串返回0
0x40169c: xor edx, edx ; edx = 计数器 i
0x40169e: xor ecx, ecx ; ecx = 累加和
0x4016a0: add edx, 1 ; i++
0x4016a3: movzx eax, al
0x4016a6: imul eax, edx ; eax = char * i
0x4016a9: add ecx, eax ; sum += char * i
0x4016ab: movzx eax, byte ptr [ebx + edx] ; 下一个字符
0x4016af: test al, al
0x4016b1: jne 0x4016a0 ; 循环
0x4016b3: mov eax, ecx ; 返回sum
0x4016b5: pop ebx
0x4016b6: ret
校验和算法(C语言表示):
unsigned int calculate_checksum(const char* str) {
unsigned int sum = 0;
for (int i = 0; str[i] != '\0'; i++) {
sum += (i + 1) * (unsigned char)str[i];
}
return sum;
}
五、Flag解密过程
5.1 提取加密数据
从反汇编代码中提取的加密数据(小端序):
| 偏移 |
加密值 |
字节序列 |
| 0-3 |
0x2d327077 |
77 70 32 2d |
| 4-7 |
0x63272b28 |
28 2b 27 63 |
| 8-11 |
0x701d6363 |
63 63 1d 70 |
| 12-15 |
0x1d747072 |
72 70 74 1d |
| 16-19 |
0x3232230a |
0a 23 32 32 |
| 20-23 |
0x272c1d3b |
3b 1d 2c 27 |
| 24-27 |
0x273b1d35 |
35 1d 3b 27 |
| 28-29 |
0x3023 |
23 30 |
| 30 |
0x63 |
63 |
5.2 XOR解密
使用密钥 0x42 进行XOR解密:
encrypted = bytes.fromhex('7770322d282b276363631d707270741d0a2332323b1d2c27351d3b27233063')
decrypted = bytes([b ^ 0x42 for b in encrypted])
# 结果: b'52pojie!!!_2026_Happy_new_year!'
5.3 校验和验证
def calculate_checksum(s):
total = 0
for i, c in enumerate(s):
total += (i + 1) * ord(c)
return total
flag = "52pojie!!!_2026_Happy_new_year!"
checksum = calculate_checksum(flag)
# 结果: 44709 ✓ 与程序期望值匹配
六、验证结果
6.1 最终Flag
52pojie!!!_2026_Happy_new_year!
6.2 验证截图
========================================
CrackMe Challenge v2.5 - 2026
========================================
Keywords: 52pojie, 2026, Happy new year
Hint: Fake flag; length is key
----------------------------------------
[?] Enter the password:
========================================
*** SUCCESS! ***
========================================
[+] Congratulations! You cracked it!
[+] Correct flag: 52pojie!!!_2026_Happy_new_year!
Press Enter to exit...
七、技术总结
7.1 逆向分析要点
- 字符串分析:通过提取程序中的字符串,发现了假flag和关键提示
- 动态测试:通过测试不同长度密码,确定了正确密码长度为31字符
- 反汇编分析:定位到flag解密函数和校验和计算函数
- 算法逆向:成功还原了XOR加密算法和校验和计算算法
7.2 关键技术点
| 技术点 |
说明 |
| 加密算法 |
XOR,密钥=0x42 |
| 校验算法 |
加权求和:Σ(i+1)*char[i] |
| 目标校验和 |
44709 |
| 密码长度 |
31字符 |
7.3 工具使用
- pefile:PE文件格式解析
- Capstone:反汇编引擎
- Python subprocess:动态测试
八、复现步骤
- 使用
pefile 解析PE文件结构
- 提取
.rdata 节中的字符串信息
- 动态测试确定密码长度为31
- 使用
Capstone 反汇编定位关键函数
- 从
0x00401620 提取加密数据
- 使用XOR密钥
0x42 解密得到flag
- 验证校验和为44709
- 运行程序验证flag正确
报告完成时间: 2026-02-27
分析工具: Python + pefile + Capstone
Flag: 52pojie!!!_2026_Happy_new_year!