-
-
[原创]CTF2017第三题分析(qwertyaa)
-
发表于: 2017-10-28 19:05 2842
-
必须先吐槽一下这道题夸张的多解... ...
sub_435DE0内的一些静态字符串都是.-*之类的,不难猜测和morse有关,其实是将一种 (可能) 特殊的morse电报码转换为字母数字和空格组成的字符串。
sub_42DA78内是三个函数,第一个里面又初始化了一些常数,这是典型的加密算法的特征,但萌新看不出来是什么算法,随便选几个常数百度发现是SM3(一个不怎么有存在感的国标hash算法)。
(程序中还藏了一些字符串,什么base641/2,morse,提示上述算法的存在... ...)
后面似乎把计算出来的内容从二进制转换为由字母数字组成的可视的hex,然后和一开始输入内容比对,大概是bin2hex(SM3(morse_decode(base64_decode(base64_decode($key)))))==subtr($key,0,-20),似乎base64_decode有特殊的技能忽略最后的加上去的SM3得出的值,这点我没有进一步分析,可能和第二次base64_decode时这部分不再由base64可接受的可见字符组成有关。
接下来还有一个验证sub_42D9AB,传入参数push offset unk_49B000是存着一个10*10的01矩阵,分析代码可知是它把morse_decode(base64_decode(base64_decode($key)))这个字符串从前向后扫描,扫描到qzlp四个字符时将指向01矩阵中从左上(0,0)的一个指针,上下左右移动,其中到(3,8)处后不会再动,并且程序在收到空格后结束,只要这个指针不碰壁(1为墙壁,0位空地),或者在其中两种操作后不回走,就可以成功输出ok。
这就是多解的万恶之源,它甚至不检查是否有其他字母混进来,甚至空字符串也可以通过,也不要求走到哪个位置,也不检查空格后有无额外字符....
我走完了这个迷宫,得到一个长key
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!