-
-
[原创]看雪CTF第三题crackme解题思路
-
2017-10-30 09:39
4132
-
考点我觉得可以分:
(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
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课