首页
社区
课程
招聘
[原创]看雪.TSRC 2017CTF秋季赛第三题 wp
发表于: 2017-10-29 19:34 3259

[原创]看雪.TSRC 2017CTF秋季赛第三题 wp

2017-10-29 19:34
3259

我为了做题,拒绝妹纸的邀请~

这是一道很简单的题,反调试的坑略多。这道题采用了很多常用的反调试手段,比如调用IsDebuggerPresent、进程名检查等等。另外也有利用SEH的非常规检测方法。现在的OD插件能轻松对付常规反调试,暗坑还需手动处理,我的工具太原始了。

我做这道题,猜+Python直接输出了答案,有了答案再对程序做了详细点的分析。猜是把算法和输入数据猜对了。所以有一定运气成分。

首先通过对GetDlgItemTextA 下断点定位到关键函数434EF0(Base:400000).

在这个函数的开头,有常规反调试,可以无视。接着会调用GetDlgItemTextA获取用户输入的字符串并将输入的字符串进行两次变换,经过我测试发现,大部分输入经过两次变换后内存都是00(缓冲区长度1024左右),然后将变换后的结果取前3个字节送入一段数字摘要算法,该数字摘要算法的结果为32字节,转换HEX String后应当有64个ASCII字符,最后将64位长度的签名与用户输入进行比较。

初次看来,这段算法既然是摘要算法,那么输入怎么可能等于输出?这道题连续两次调用一个转换函数,会把任意字符串转成00,又因为每次固定取3字节签名,所以送入算法的数据恒定为:00 00 00. 后面会对这段摘要算法进行分析。

关键部分代码如下:

这段算法应该属于OpenSSL的一部分,有明显的OPenSSL风格,但是作者在算法内部内嵌了很多非常规的异常反调试手段,一共有4块,手动修改EIP绕过即可。

以下代码片段是作者封装的sm3算法函数:

作者分别在sub_42D294、sub_42DF2D、sub_42D15E插入了反调试代码,代码非常显眼。

几乎所有反调试相关的代码都是这种判断格式,汇编特征更加明显:

在动态调试时,直接强制修改EIP到pop edi处实现绕过,后面几处同样的方法处理,一定要注意别跳错了,我就因为跳错了,程序没报错,算出来的结果是错的。

特征大概是call xxx,mov [XXX],eax,cmp eax,0 类似的指令序列。

那么我是如何判断这个算法的呢?这个算法是sm3算法,在百度上有很多资料。 通过搜索关键常量,就可以在百度上找到相关实现代码。

*(a1 + 8) = 0x7380166F;

*(a1 + 12) = 0x4914B2B9;

*(a1 + 16) = 0x172442D7;

*(a1 + 20) = 0xDA8A0600;

*(a1 + 24) = 0xA96F30BC;

*(a1 + 28) = 0x163138AA;

*(a1 + 32) = 0xE38DEE4D;

*(a1 + 36) = 0xB0FB0E4E;

Python实现如下:

输出答案:

y = hash_msg("\x00\x00\x00")

print out_hex(y)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//