吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1564|回复: 15
收起左侧

[CTF] 【2025春节】解题领红包之二 Windows初级题 WriteUp (动态调试详解)

  [复制链接]
ahov 发表于 2025-2-13 11:32
本帖最后由 ahov 于 2025-2-13 12:00 编辑

先说结论:本题通过动态调试得到flag至少有两种解法。

最简单的解法是:断下两处比较指令
第一处cmp:
Error, please try again上方的cmp esi,edi(用于比较flag长度)
第二处cmp:
mov eax,dword ptr ds:[edx]
cmp eax,dword ptr ds:[ecx](用于比较flag内容)

第一步

获取flag长度

依据往年的Windows初级题,题目中一定会先比较flag长度,今年仍然如此。

首先将程序拖入Ollydbg中,运行到答案输入提示,如下图所示:
Snipaste_2025-02-13_08-32-21.png

右击-智能搜索-中文搜索引擎,进入后在Please input password下面果然能够发现两个不同的错误提示: Error, please try againWrong password, please try again,如下图所示:
Snipaste_2025-02-13_08-28-31.png

我们先进入并查看Please input passwordError, please try again这一段区间的代码,如下图所示:
Snipaste_2025-02-13_09-00-23.png

在这一段代码内可以观察到4个比较指令,其中有3个比较指令的比较值是明文,明文比较值分别为0x10 0x10000 0x1F,坑就在这里,这里是与往年最大的不同。你可以尝试这三个比较值,会发现这三个比较的值都不是flag的长度。

于是,回头看代码,发现距离Error, please try again还有一个最近的比较指令cmp esi,edi用于比较esi寄存器和edi寄存器中的值,我们还没有考虑这一比较指令。

我们在该cmp esi,edi指令处下上断点,在程序中我们输入123456(共6位)作为提交答案尝试,运行结果如下图所示:
Snipaste_2025-02-13_09-09-00.png

可以发现,程序将esi寄存器中的00000006与edi寄存器中的0000001B进行了比较。经过多次测试,可以确定esi寄存器中的值是程序中输入答案的位数,并与正确答案预期位数0000001B进行比较。
因此,我们可以确定因此我们可以确定正确flag答案位数为27位。

第二步

进军flag

确定flag位数为27位之后,我们以123456789012345678901234567(共27位)作为提交答案尝试,成功跳过了Error, please try again逻辑。

法一

我们发现Error, please try again下方有一个循环体会逐字符进行一些解密操作(见法二),其中ecx寄存器和edi寄存器充当累加器的作用,只有当比较累加器的值刚好达到0000001B时才会跳出循环体,如下图所示:
Snipaste_2025-02-13_09-20-26.png
Snipaste_2025-02-13_09-21-04.png
Snipaste_2025-02-13_09-21-27.png
Snipaste_2025-02-13_09-21-59.png
这个地方法一无需操作,是另一种解法,见法二。

我们在下方Success! Congratulations!之前可以看到一处相似的逻辑:

mov eax,dword ptr ds:[edx]  ;加载当前值
cmp eax,dword ptr ds:[ecx]  ;与期望值比较

在该逻辑中,只有比较成立(即两值相等)才会跳出循环体执行后续代码,如下图所示:
Snipaste_2025-02-13_09-33-32.png
Snipaste_2025-02-13_09-33-58.png

我们在该cmp eax,dword ptr ds:[ecx]指令处下上断点,flag就会直接在ECX寄存器中出现,如下图所示:
Snipaste_2025-02-13_09-30-49.png

最后的最后:程序还会比较提交的答案前4位是否为fl@g,如下图所示:
Snipaste_2025-02-13_10-05-03.png
Snipaste_2025-02-13_10-10-48.png
Snipaste_2025-02-13_10-11-22.png
Snipaste_2025-02-13_10-11-44.png

法二

在法一中我们发现:

imul eax,edx,0x41C64E6D
......
add byte ptr ds:[ecx-0x1],al
cmp edi,esi  ;累加器
jnz short 【2025春.001A24D0

这一部分代码在执行解密操作,非常可疑。

已经确认cmp edi,esi这一行只是普通的计数累加器,我们看到上一行add byte ptr ds:[ecx-0x1],al仍然在进行加解密操作,可以推断add byte ptr ds:[ecx-0x1],al这一行可能是加解密操作核心逻辑的最后一行,我们在这一行下上断点。
这一行共有两个元素ds:[ecx-0x1]a1,观察之后发现ds:[ecx-0x1]嫌疑很大,很有问题。

我们选中该行,右击ds-数据窗口中跟随地址,如下图所示:
IMG_1210.jpg

不断继续运行,神奇的一幕出现了:
Snipaste_2025-02-13_11-20-02.png
(再继续执行一步就可以得到完整的flag了)

彩蛋

AI都会解:
IMG_1211.jpg
IMG_1212.jpg

免费评分

参与人数 5威望 +2 吾爱币 +104 热心值 +5 收起 理由
笙若 + 1 + 1 用心讨论,共获提升!
ChenDibang + 1 + 1 我很赞同!
adam717 + 1 + 1 谢谢@Thanks!
ioyr5995 + 1 + 1 我很赞同!
Hmily + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

星期日 发表于 2025-2-13 18:55
初级题我自己尝试了一周,各种ai问了一遍,一开始说token长度不够,后来才发现可以保存到文件再发过去问ai。最后都没有搞懂。纯新手小白要先学什么?汇编?

点评

问啥ai,动手动态调试啊,遇到不会的问问还行。。。  详情 回复 发表于 2025-2-13 22:31
z42282 发表于 2025-2-13 23:42
原来这样啊,我也尝试了半天,一步一步跟,然后不懂的地方问AI,最后到是找到关键断点了,也看到了flag的内容,但以为那个不是答案。。。
ilovebucher2 发表于 2025-2-13 12:42
longwujiao 发表于 2025-2-13 14:22
谢谢分享,讲解的很清楚,适合小白!
ivorist 发表于 2025-2-13 15:20
初级题居然不是明码,太难了
MrJin 发表于 2025-2-13 15:50
看来我还是学习不到位,看详解居然还会比较困难,我要再接再厉,加油!
Hmily 发表于 2025-2-13 22:31
星期日 发表于 2025-2-13 18:55
初级题我自己尝试了一周,各种ai问了一遍,一开始说token长度不够,后来才发现可以保存到文件再发过去问ai ...

问啥ai,动手动态调试啊,遇到不会的问问还行。。。

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
星期日 + 1 + 1 感谢大神回复,就纯新手小白,让ai帮忙分析汇编代码流程

查看全部评分

Flye 发表于 2025-2-14 16:34
顶,很详细的讲解,适合我这种小白
qcd19940127 发表于 2025-2-14 16:47
顶,看了一遍 过了一遍 还需要动手操作一遍才知道
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-3-19 00:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表