首先将程序拖入x32dbg中,运行到答案输入提示,如下图所示:
Snipaste_2025-01-30_17-09-43.png (101.27 KB, 下载次数: 0)
下载附件
2025-1-30 19:04 上传
右击-搜索-当前区域-字符串,随后可以发现“恭喜你,回答正确”字符串,如下图所示:
Snipaste_2025-01-30_17-11-27.png (113.11 KB, 下载次数: 0)
下载附件
2025-1-30 19:05 上传
点击进入,可以发现上下文中存在多个比较指令,我们将其统统下上断点,如下图所示
Snipaste_2025-01-30_17-13-56.png (45.15 KB, 下载次数: 0)
下载附件
2025-1-30 19:05 上传
尽管可以看到有两个字符"H"和"a"极有可能是flag的一部分,但是我们确保科学性和严谨性,仍然输入"abcdefg"作为提交答案尝试。
答案提交后,运行到cmp ebp,48时可以看到,程序将我们输入的答案中的第1个字符"a"存储进了EBP中,并与"H"进行了比较(见左下),证明了我们的猜想——flag的第一个字符为"H",如下图所示:
Snipaste_2025-01-30_17-15-51.png (38.3 KB, 下载次数: 0)
下载附件
2025-1-30 19:05 上传
为了使答案检验过程继续运行,我们需要将EBP中的数据修改为"H",如下图所示:
Snipaste_2025-01-30_17-18-54.png (59.01 KB, 下载次数: 0)
下载附件
2025-1-30 19:06 上传
继续执行程序,可以看到程序将我们输入的答案中的第2个字符"b"与"a"进行了比较(见左下),如下图所示:
Snipaste_2025-01-30_17-20-05.png (49.85 KB, 下载次数: 0)
下载附件
2025-1-30 19:06 上传
同样的方式,我们将地址ESP+18修改为"a"然后继续运行,如下图所示:
Snipaste_2025-01-30_17-21-06.png (51.53 KB, 下载次数: 0)
下载附件
2025-1-30 19:07 上传
在程序运行到cmp edi,ebx时,我们可以看到:此时edi = "c" (我们输入的答案的第3位); ebx = "d" (我们输入的答案的第4位),如下图所示:
Snipaste_2025-01-30_17-22-15.png (49.18 KB, 下载次数: 0)
下载附件
2025-1-30 19:08 上传
程序此时正准备比较edi和ebx,说明edi和ebx应当是相等的,即flag的第3位和第4位应当相等。
结合前面的"Ha",我们可以猜测flag的前4位为"Happ"。
我们不妨将edi和ebx均改为"p",如下图所示:
Snipaste_2025-01-30_17-31-41.png (56.89 KB, 下载次数: 0)
下载附件
2025-1-30 19:08 上传
Snipaste_2025-01-30_17-32-32.png (58.53 KB, 下载次数: 0)
下载附件
2025-1-30 19:08 上传
继续运行后,发现程序进行了异或运算后将edx与值FFFFF1E3进行比较,只有当edx的值等于FFFFF1E3时才继续执行后续操作,如下图所示:
Snipaste_2025-01-30_17-46-19.png (49.03 KB, 下载次数: 0)
下载附件
2025-1-30 19:09 上传
该逻辑不影响flag的获取,为了使答案检验过程继续运行,我们将edx的值修改为FFFFF1E3后继续运行程序,如下图所示:
Snipaste_2025-01-30_17-47-09.png (58.13 KB, 下载次数: 0)
下载附件
2025-1-30 19:10 上传
程序继续执行后,我们可以关注到,下一个比较指令为cmp a1,c1,目的是判断a1与c1是否相等,在此之前我们需要先确定a1和c1是什么东西以及a1与c1和flag之间的关系。
在比较指令上面,我们可以看到两行至关重要的指令:
mov a1,byte ptr ds:[esi+1]
mov b1,byte ptr ds:[esi+4]
在调试器中我们可以看到,esi+01:"bcdefg" (把我们输入的答案的第1位移除了),然后程序取了"bcdefg"的第1位"b" (也就是我们输入的答案的第2位) 作为a1,然后对a1进行异或计算,如下图所示:
Snipaste_2025-01-30_17-55-02.png (58.54 KB, 下载次数: 0)
下载附件
2025-1-30 19:10 上传
同理,esi+04:"efg" (把我们输入的答案的前4位移除了),然后程序取了"efg"的第1位"e" (也就是我们输入的答案的第5位) 作为c1,如下图所示:
Snipaste_2025-01-30_17-55-37.png (58.72 KB, 下载次数: 0)
下载附件
2025-1-30 19:11 上传
我们当前可以猜测flag前五位为"Happy",不妨重新启动程序并调试,输入"Happyfg"作为提交答案尝试。经过尝试后发现,当提交答案前5位为"Happy"时(理论上只需要提交的答案第2位为"a"且第5位为"y"时就可以,未具体测试),a1就会与c1相等(见左下),如下图所示:
Snipaste_2025-01-30_17-58-25.png (56.74 KB, 下载次数: 0)
下载附件
2025-1-30 19:12 上传
继续运行程序,在mov dword ptr ss:[esp+10],eax指令处或fild dword ptr ss:[esp+18]指令处断下来之后,直接查看eax就可以看到"2025",如下图所示:
Snipaste_2025-01-30_17-59-37.png (68.54 KB, 下载次数: 0)
下载附件
2025-1-30 19:12 上传
将上述信息整合后确定flag为"Happy2025",提交后确认flag答案正确,如下图所示:
Snipaste_2025-01-30_18-01-34.png (109.16 KB, 下载次数: 0)
下载附件
2025-1-30 19:13 上传