news 2026/5/11 17:01:02

Windows GUI 逆向分析题(CrackMe)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows GUI 逆向分析题(CrackMe)

首先下载文件在detect it easy中进行查壳,

从 DIE 结果可以知道:

  • PE32,32 位 GUI 程序(Windows GUI)

  • 编译器:Microsoft Visual C/C++ (12.00.9782)

  • 调试信息:包含 PDB 路径(说明可能有符号信息)

  • Overlay在偏移0x2B000处有 0x64 字节数据(可能是附加数据或 flag)

  • 语言:C++

然后把它放入IDA中进行查看,

找到了关键函数DialogFunc_0

int __stdcall DialogFunc_0(HWND hWnd, int a2, int a3, int a4)
{
int v4; // eax
char Source[260]; // [esp+50h] [ebp-310h] BYREF
_BYTE Text[257]; // [esp+154h] [ebp-20Ch] BYREF
__int16 v8; // [esp+255h] [ebp-10Bh]
char v9; // [esp+257h] [ebp-109h]
int Value; // [esp+258h] [ebp-108h]
CHAR String[260]; // [esp+25Ch] [ebp-104h] BYREF

memset(String, 0, sizeof(String));
Value = 0;
if ( a2 == 16 )
{
DestroyWindow(hWnd);
PostQuitMessage(0);
}
else if ( a2 == 273 )
{
if ( a3 == 1000 )
{
GetDlgItemTextA(hWnd, 1002, String, 260);
strlen(String);
if ( strlen(String) > 6 )
ExitProcess(0);
v4 = atoi(String);
Value = v4 + 1;
if ( v4 == 122 && String[3] == 120 && String[5] == 122 && String[4] == 121 )
{
strcpy(Text, "flag");
memset(&Text[5], 0, 0xFCu);
v8 = 0;
v9 = 0;
_itoa(Value, Source, 10);
strcat(Text, "{");
strcat(Text, Source);
strcat(Text, "_");
strcat(Text, "Buff3r_0v3rf|0w");
strcat(Text, "}");
MessageBoxA(0, Text, "well done", 0);
}
SetTimer(hWnd, 1u, 0x3E8u, TimerFunc);
}
if ( a3 == 1001 )
KillTimer(hWnd, 1u);
}
return 0;
}

这段代码是对话框处理函数,当点击 ID 为1000的按钮(应该是 "Crack" 按钮)时会执行验证逻辑:

1.密码检查条件

if ( v4 == 122 && String[3] == 120 && String[5] == 122 && String[4] == 121 )

v4 = atoi(String)String是用户输入的密码。

条件为:

  • atoi(String) == 122→ 输入字符串转换为整数后必须等于 122

  • String[3] == 'x'(ASCII 120)

  • String[4] == 'y'(ASCII 121)

  • String[5] == 'z'(ASCII 122)

注意:字符串索引从 0 开始,所以:

  • String[3]是第 4 个字符

  • String[4]是第 5 个字符

  • String[5]是第 6 个字符

2.长度限制

if ( strlen(String) > 6 ) ExitProcess(0);

输入长度 ≤ 6 个字符


推导正确密码

我们设密码为s[0]s[1]s[2]s[3]s[4]s[5](最多 6 字符):

  1. atoi(String) == 122

    • atoi会从字符串开始解析数字,直到遇到非数字字符

    • 最简单的满足方式:"122"(但这样长度不够 6 且后面的字符条件不满足)

  2. 考虑到后面有特定字符要求,且atoi在遇到非数字字符时会停止解析,所以我们可以这样构造:

    • 让前三个字符是"122"(这样atoi("122...") == 122

    • 然后s[3] = 'x',s[4] = 'y',s[5] = 'z'

所以密码是122xyz

验证:

  • atoi("122xyz")= 122 ✓

  • s[3] = 'x'

  • s[4] = 'y'

  • s[5] = 'z'

  • 长度 = 6 ✓


生成 Flag

当密码正确时,代码生成 flag:

strcpy(Text, "flag"); _itoa(Value, Source, 10); // Value = v4 + 1 = 122 + 1 = 123 strcat(Text, "{"); strcat(Text, Source); // "123" strcat(Text, "_"); strcat(Text, "Buff3r_0v3rf|0w"); strcat(Text, "}");

所以 flag 是

flag{123_Buff3r_0v3rf|0w}

验证方法

  1. 运行程序,在输入框输入122xyz

  2. 点击 "Crack" 按钮

  3. 应该会弹出 "well done" 消息框,显示 flag

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 16:35:12

kanass全面介绍(18) - 如何通过仪表盘,快速直观掌握项目进度及度量

kanass是一款国产开源免费、简洁易用的项目管理工具。不仅具有项目、项目集、迭代、事项等管理功能,还有丰富的图表,用不同的维度展示数据,直观的看出项目等模块进度。1、默认仪表盘1.1 事项统计在系统首页的事项统计区域,放置了事…

作者头像 李华
网站建设 2026/5/11 0:08:05

Samba as Wins Server

自己做的小小實驗 希望能跨網段透過netbios存取同一工作群組下的電腦 Q1 : 同一工作群組在網路芳鄰重新整理會直接出現 還是要連線後才會出現? 用Samba 當作wins server Alpine Linux 安裝samba apk add samba編輯 /etc/samba/smb.conf vi /etc/samba/smb.conf將 wins supp…

作者头像 李华
网站建设 2026/5/11 0:08:05

电子会计档案管理系统:档案宝如何发挥会计档案的价值?

一、引言:电子会计档案时代,档案宝的价值定位在数字化转型浪潮下,会计档案已从传统纸质存储的 “历史凭证”,转变为企业决策的 “数据资产”。电子会计档案管理系统 “档案宝”,打破了传统档案管理的时空限制与效率瓶颈…

作者头像 李华
网站建设 2026/5/9 16:15:36

计算广告:智能时代的营销科学与实践(二十一)

目录 11.2 担保式投送系统 11.2.1 流量预测 11.2.2 频次控制 11.3 在线分配 11.3.1 在线分配问题 11.3.2 在线分配问题举例 11.3.3 极限性能研究 11.3.4 实用优化算法 总结 11.2 担保式投送系统 担保式投送(Guaranteed Delivery, GD&#xff09…

作者头像 李华
网站建设 2026/5/11 0:24:03

计算广告:智能时代的营销科学与实践(二十三)

目录 第13章 竞价广告核心技术 13.1 竞价广告计价算法 1. 从密封竞价到广义第二价格:市场的进化 2. VCG拍卖:理论上的完美与现实的差距 3. 计价算法的工程实现与考量 4. 计价的演进:从CPC到oCPX 13.2 搜索广告系统 13.2.1 查询扩展 1…

作者头像 李华
网站建设 2026/5/9 18:53:23

【完整源码+数据集+部署教程】食品物品检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着全球经济的快速发展和生活水平的不断提高,食品消费市场日益繁荣,食品安全问题也随之凸显。食品物品的检测与识别不仅是保障消费者权益的重要环节,也是提升食品产业链效率的关键因素。传统的食品检测方法多依赖人工检查&…

作者头像 李华