-
-
[原创]第三题 Writeup
-
发表于: 2017-10-30 07:34 2582
-
反调试加的丧心病狂……不想过反调试了
尝试使用纯静态分析
程序的算法结构还是很清楚的,两次base64,一次摩尔斯电码,一次哈希算法,最后一步为走迷宫
base64部分:
看上去似乎是有变形的base64算法,但把算法抽出来调试发现实际上是标准的base64解码算法
如果遇到非法字符则返回,但之前已解码成功的字符已经保存了。(出现多解的可能性1:利用非法字符截断base64)
对输入的字符串连续两次base64解码,然后是摩尔斯解码
摩尔斯部分:
含有小写字母、数字和符号的解码,以空格分割,以斜杠编码“空格”字符,但考虑到后面的迷宫只有上下左右四个方向,故可以只记录对应的4个字符的摩尔斯编码。
(出现多解的可能性2:任意长度的空格字符都被视为一个分割符,且直接略过非法字符)
然后程序对摩尔斯部分的前三位进行哈希算法,并和原来输入字符串的最后64位进行比较
哈希部分存在一个常量表
查阅资料可知常量表对应的算法为SM3杂凑算法
并且找到了与程序中极为相似的源码
http://www.cnblogs.com/20135319zl/p/6366129.html
算一下前三位的哈希,为b92a72497b685c31013347a7276f371f8cf91085ab8322009bfed2df41d94f94
若哈希校验成功则进入最后的走迷宫比对
算法
这里IDA的自动分析有点问题,char和int型的指针混了,不过人工判断应该a1为char型,而指向的数据为int型
所以为一个10 * 10的迷宫
迷宫
只能走在为0的格子,且不能走回头路
记左上角为(0,0),往右往下为x++,y++,要走到(8,3)处
显然,是有两条路的 = =
(出现多解的可能性3:迷宫走法不唯一)
操作为q上z下p左l右
比划一下,很快得出路线
最后综合以上算法,写解题脚本,得flag
解题脚本
from base64 import b64encode
# left = p # right = l # up = q # down = z #mazeAnswer = "zlzllllzzzppqppzzzlllzlllzllqqpqpqqql" mazeAnswer = "zlzllllzzzppqppzzzlllzlllzllqqpqpqqlq" def morseEncode(s): morseDict = {'z' : '--..', 'l' : '.-..', 'p' : '.--.', 'q' : '--.-'} res = "" for i in s: res += morseDict[i] res += " " res += "/ " return res morseAnswer = morseEncode(mazeAnswer) print morseAnswer flag = b64encode(b64encode(morseAnswer)) + "b92a72497b685c31013347a7276f371f8cf91085ab8322009bfed2df41d94f94" print flag
然而怎么都交不对……大概是可能的正确解太多了
补充:出题人说是只能字母数字,那么摩尔斯补空格把base64对齐
TFMwdUxpQXVMUzR1SUMwdExpNGdMaTB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDMHRMaTRnTFMwdUxpQXVMUzB1SUM0dExTNGdMUzB1TFNBdUxTMHVJQzR0TFM0Z0xTMHVMaUF0TFM0dUlDMHRMaTRnTGkwdUxpQXVMUzR1SUM0dExpNGdMUzB1TGlBdUxTNHVJQzR0TGk0Z0xpMHVMaUF0TFM0dUlDNHRMaTRnTGkwdUxpQXRMUzR0SUMwdExpMGdMaTB0TGlBdExTNHRJQzR0TFM0Z0xTMHVMU0F0TFM0dElDNHRMaTRnTFMwdUxTQXZJQT09b92a72497b685c31013347a7276f371f8cf91085ab8322009bfed2df41d94f94
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
他的文章
看原图
赞赏
雪币:
留言: