首页
社区
课程
招聘
[讨论]迷雾中的琴声——解题思路
发表于: 2019-6-15 09:58 5729

[讨论]迷雾中的琴声——解题思路

2019-6-15 09:58
5729

程序没有加壳,可以直接跟踪调试。

首先通过断Messagebox找到程序各个判断的地方,改掉验证字符长度,验证字符输入和验证CRC的分支后我们发现程序最后跳进了0x004044C8


继续跑,程序直接异常了

重新打开程序,对这个地址下断,根据看内存的值可以判断这里是一个16B的数组

而最后程序会跳到这个数组里执行代码

通过对程序的分析,可以知道里面有一个CRC48校验

要构造出能弹出Win的shellcode不难,但碰不上CRC校验。所以此路不通。

要构造出CRC校验,就只能用10B完成弹出Win的任务,然后用剩下的6B满足CRC校验。然而,当时的寄存器中也并没有存放”Win”的地址,光是call Messagebox 和push 字符串地址就占掉了10B了。所以,光靠这10B想完成任务也是行不通的。

因此可以肯定:这10B最终将跳转到其他的地方执行代码,而剩下的6B是根据这10B和CRC校验反推出来的。

那么我们就得找其他的地方是否可以执行出弹出带”Win”的Messagebox代码,作者是否留下了什么线索或漏洞。

线索一:这个exe的资源节是可执行的!!!

众所周知,正常编译出的exe的资源节没有执行权


然而,这个exe的4个节区都是可读可写可执行。这说明了数据区和资源区是可以在运行中修改数据并且可以执行代码的!


简单观察可以发现:资源节中4个字节为一组,第4个字节固定是FF,明显有规律。


但是,这里很明显有不符合规律的数据出现在了资源里面

这个地址是:0x1A390h + 2000h + 400000h = 41C390h

在Debug里面反汇编就能看出这里是一段弹出messagebox的代码。

显然,那10B应该跳到这里来!

如果觉得查看程序各节的权限,属于高难度技术手段,还有更简单的线索二:

线索二:用肉眼看一看这个程序的资源

这个程序没有什么其它资源,基本上就是图标了。用工具提取icon资源区图标,看看!


这里其他图片都没有彩色的点,这里却有彩色的点


有彩色点的图片是Icon的第6张




找到资源icon的第6个图标资源区,注意这个

根据上下格式这里有一段二进制和正常的icon数据不同(正常的格式4字节一组第4字节为FF),这也说明了为什么图片上有莫名的斑点

这里可以拿到文件地址 1A390h 


程序没有开启随机基址 基址位置 0x00400000h


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-6-18 13:47 被leafpad编辑 ,原因: 补充
收藏
免费 3
支持
分享
最新回复 (3)
雪    币: 10845
活跃值: (1054)
能力值: (RANK:190 )
在线值:
发帖
回帖
粉丝
2
此题特别的设计就在于:6B-CRC
如果出题者只限制了2B-CRC,估计此题早就被很多人破解了。因为要构造出14B的shellcode是容易的。
如果出题者真限制了11B-CRC,估计也早就被破解了。因为要想用5B构造出shellcode显然是不可行的,必须借助外援。这样很快就会让人想到去寻找其它代码。
而出题者偏偏选择了6B-CRC,给破解者卖了一个“破绽”,让其以为有希望构造得出来,但其实却行不通。许多破解者都在这个泥潭里奋战了许久而不得脱困。唯见风间仁迅速识破这个陷阱,跳了出来,破解成功。牛!
2019-6-25 09:12
1
雪    币: 8209
活跃值: (4518)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
3
68 96C34100      PUSH 0041C396
C3                       RETN
如果用上面这6个字节代替5字节的jmp,同时满足了CRC呢,
算不算是5B-CRC呢

2019-6-25 12:56
0
雪    币: 10845
活跃值: (1054)
能力值: (RANK:190 )
在线值:
发帖
回帖
粉丝
4
ccfer 68 96C34100 PUSH 0041C396 C3 RETN 如果用上面这6个字节代替5字节的jmp,同时满足了CRC呢, 算不算是5 ...
如果能满足crc,那么应该算另一种多解思路。
2019-6-25 13:28
0
游客
登录 | 注册 方可回帖
返回
//