首页
论坛
课程
招聘
[原创]看雪CTF第三题crackme解题思路
2017-10-30 09:39 2240

[原创]看雪CTF第三题crackme解题思路

2017-10-30 09:39
2240
考点我觉得可以分:
(1)patch反调试
(2)base64、morse的解码和sm3的hash
(3)迷宫的绕过
(4)base64解码函数绕过

patch就不多说了,各有各的方法,可以直接暴力nop,也可以构造跳转绕过反调试函数;
IDA载入程序,整理出算法的逻辑是:
(1)对输入的注册码进行两次base64解码,得到摩斯码;
(2)对摩斯码进行解码,得到明文;
(3)对摩斯码进行sm3 hash,得到hash值;
(4)进行第一次验证,取输入的注册码末64位和hash值比较,若相等,进行下一步验证;
(5)进行第二次验证,明文进入迷宫进行判断,能绕过则成功。

我先入手的是第二次验证,构造迷宫的绕过,后来发现绕过方式太多了,说下大概的几种:
(1)输入不含'z', 'l', 'q', 'p';
(2)输入为 'zlzllllzzzppqppzzzlllzlllzllqqpqpqqlqpqqllq' 的子串(从头部开始往后),能走完迷宫(z-->下, l-->右, q-->上 , p-->左);
(3)输入直接为空格‘ ’,在最开始迷宫判断时就结束。




这样绕过的方式很多,没啥思路,看看第一次验证:
hash值要和输入的末64位相等,乍看之下不太可能啊,64位(一开始想的是base64码)怎么可能和hash值相等,还真跑了下,没找到- -
这里考了个点,就是base64解码函数在解码时是每4个字节一组进行解码,不足时补0,这就意味着即使不是正常的可见字符编码得到的base64值,也能进行解码。

那么思路就清晰了,先构造明文绕过迷宫,再对明文进行morse编码,编码后进行sm3 hash运算,morse编码进行两次base64编码运算,最后得到的base64字串附加64位的hash值,成功!

答案不止一个,最简单的绕过就是直接空格
明文(‘ ’)
morse(' ')='/'
base64encode1('/')='Lw'
base64encode2('')='THc9PQ' 
sm3('/')= 2f725aaf8d9fa538554e9f3589ddc785364d52ab1a6760c12caa2ec01ae4ba9e

注册码为: THc9PQ2f725aaf8d9fa538554e9f3589ddc785364d52ab1a6760c12caa2ec01ae4ba9e

[培训]12月3日2020京麒网络安全大会《物联网安全攻防实战》训练营,正在火热报名中!地点:北京 · 新云南皇冠假日酒店

收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 7175
活跃值: 活跃值 (759)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
KevinsBobo 活跃值 8 2017-10-30 21:26
2
0
大佬,请问你的ida是如何识别base64编码的?
雪    币: 5
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
苏stone 活跃值 2017-10-30 21:29
3
0
大神是怎么识别出base64和sm3的函数,我用findcrypt.py不管用啊
雪    币: 221
活跃值: 活跃值 (11)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
照片记录谁 活跃值 2017-10-30 22:46
4
0
2个base64看出来了,空格绕过也看出来了,剩下的morse和sm3没整出来。。。。大佬厉害
雪    币: 149
活跃值: 活跃值 (25)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
sherlly 活跃值 4 2017-11-11 20:22
5
0
自己识别的-  -
游客
登录 | 注册 方可回帖
返回