首页
社区
课程
招聘
1
[原创]看雪CTF2017秋季赛第五题Writeup
发表于: 2017-11-2 00:42 6101

[原创]看雪CTF2017秋季赛第五题Writeup

2017-11-2 00:42
6101

相关工具:IDA、OD、python

由程序图标得知这是一个MFC程序。打开程序,随便输入sn,弹出失败对话框。

用OD打开CM,bp MessageBoxW,运行,输入sn,点击确定,触发MessageBoxW断点。栈回溯确定调用源0x407245,随即找到按钮处理函数0x4071fd。

主函数逻辑很简单,判断sub_406fc3的返回值。0弹出“失败”,1弹出“成功”,2弹出“你就差一点啦”

跟进0x406fc3函数,在正常流程中发现int 2d指令



int 2d反调试原理很简单,正常运行时int 2d触发异常,进入程序的异常处理函数。而当调试运行时,OD会处理该异常,将eip+1继续运行。

下图是CM设置的异常处理函数

patch掉int 2d,修改为jmp 0x40717d即可正常调试。

异常处理函数中有3个关键判断

判断1是CM最重要的部分,下面我会详细分析判断1。

作者设置判断2是为了防止程序多解。事实上,如果在分析理清了作者的算法思路,那么逆推得出的sn会自然的pass掉判断2。

为了便于描述,设var_d9f4开始,大小为0x30的字节流为BLOCK1。var_d934开始,大小为0x30的字节流为BLOCK2。

成功条件就是:BLOCK1和BLOCK2全等。

在0x40718b处下断,调试发现BLOCK1和BLOCK2都被初始化过。BLOCK1被初始化为0x00-0x2F依次递增排列,BLOCK2被初始化为0x00-0x2F的乱序排列。

往前翻代码,发现如下代码:

调试发现,sub_4084A3就是初始化BLOCK1和BLOCK2的函数。初始化时,sub_4084A3被调用(传入了字符串参数”KanXueCrackMe2017“,传入了BLOCK1的地址)(事实上,BLOCK1和BLOCK2在内存中是紧挨着的,实际上做变换的是BLOCK2),判断1前,sub_4084A3再次被调用(传入了我们的sn字符串,传入了BLOCK1的地址)。

为了使判断1成功,要让BLOCK2和BLOCK1全等。调试发现,sub_4084A3并不会打乱BLOCK1,只会打乱BLOCK2。(BLOCK1一直为0x00-0x2F的递增排列)

所以我们要找的sn可以说是字符串”KanXueCrackMe2017“在函数sub_4084A3作用下的”逆“。 ”KanXueCrackMe2017“ 负责打乱递增排列的BLOCK2,而我们的SN则负责还原BLOCK2。

在打乱BLOCK之前,SN会经历4步变换

进入sub_4084A3

进入sub_40829c

对sn中的每一个char做判断:

在'0'~'9' 之间则减去'0'。结果范围[0,9]

在'A'~'Z'之间则减去'7'。结果范围[10,35]

在'a'~'z'之间则减去'='。结果范围[36,61]

变换1:由字符向[0,61]区间做1对1映射。

同样是在sub_40829c中

第一个call sub_403641作用是初始化变量。

第二个call sub_4038E1读取向[0,61]区间映射过的sn,按位权重乘以相应个数的62。

最后两个call将这些按62位权重的数求和。

变换2:转换为62进制数字

变换3:62进制转换为18进制


[注意]看雪招聘,专注安全领域的专业人才平台!

上传的附件:
  • 1.py (0.83kb,18次下载)
  • 2.py (0.79kb,16次下载)
收藏
免费 1
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2022-7-27 02:12
最新回复 (16)
雪    币: 13516
活跃值: (3801)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
2
分析的很精彩 
建议python代码直接贴出
2017-11-2 10:51
0
雪    币: 570
活跃值: (185)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
3
厉害,膜拜一下大佬
2017-11-3 12:58
0
雪    币: 8209
活跃值: (4559)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
4
厉害
2017-11-3 13:12
0
雪    币: 8209
活跃值: (4559)
能力值: ( LV15,RANK:2473 )
在线值:
发帖
回帖
粉丝
5
brichfire 厉害,膜拜一下大佬[em_13]
靠运气啊
可是我解出的sb="46F9CFFF4E725CFAE"
SN=WgYgToL0J45Y
通不过椭圆验证,怎么办
2017-11-3 13:28
0
雪    币: 1610
活跃值: (548)
能力值: ( LV12,RANK:382 )
在线值:
发帖
回帖
粉丝
6
没有ECC这题解应该不少...  不过可以穷举,  看满足条件的解是否通过ECC
2017-11-3 14:50
0
雪    币: 8460
活跃值: (4991)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
NB    这分析 
2017-11-3 16:12
0
雪    币: 217
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
真的高大上,分析得这么透彻,谢谢了
2017-11-3 20:04
0
雪    币: 240
活跃值: (441)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
9
分析的很透彻,膜拜大佬
2017-11-3 20:06
0
雪    币: 16711
活跃值: (2783)
能力值: ( LV9,RANK:147 )
在线值:
发帖
回帖
粉丝
10
厉害厉害,膜拜大佬
2017-11-4 07:30
0
雪    币: 570
活跃值: (185)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
11
半盲道人 没有ECC这题解应该不少... 不过可以穷举, 看满足条件的解是否通过ECC
没有ECC就多解了
2017-11-4 11:41
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
不错!!
2017-11-4 18:05
0
雪    币: 465
活跃值: (677)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
13
2017-11-14 22:31
0
雪    币: 1140
活跃值: (102)
能力值: ( LV4,RANK:48 )
在线值:
发帖
回帖
粉丝
14
除了膜,无fuck说
2017-11-20 20:49
0
雪    币: 4
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
patch掉int  2d,修改为jmp  0x40717d即可正常调试。
请教如何在IDA中定位到异常处理函数的地址0x40717d呢?
2018-3-20 22:56
0
雪    币: 299
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
mxr
16
厉害!
2018-5-26 09:00
0
雪    币: 870
活跃值: (2264)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
写的很好
2018-7-22 23:16
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册