bugku第七个题目love

首先把文件下载下来,是一个可执行文件,但是点击却无法运行:

bugku第七个题目love

 重装之后也还是一样,一开始以为题目就是这样的,但是一直也没找到办法解决,后来看网上的解答发现他们的程序是可以运行的,有点懵,但是拖到 ida 和 od 里面还是可以看代码的,所以就将就着做了。

首先将程序拖入 ida :

bugku第七个题目love

 找到主函数然后进入:

bugku第七个题目love

 看到有"please enter the flag"的字样,看到这个应该很敏感,于是继续往下看,发现关键代码段:

bugku第七个题目love

 到这里就已经离答案很近了,我们看到 "wrong flag" "rigth flag",可以猜测,这里应该就是判断 flag 是否正确的地方,我们可以看到上面还有一串字符串,这里要注意可能和flag有关,我们再往下看:

bugku第七个题目love

下面出现了base64字样,猜测 flag 可能和base64有关 ,在往下就看不到什么有价值的东西了,然后我们回到上面使用 f5 大法:

bugku第七个题目love

 一开始看了好久的代码,还是看不懂算法,只知道最后一个循环是将一个字符串从第一个字符开始不断地从0开始加然后得到另一个字符串,而从上面输入flag到这个循环之间的代码一直都不知道它到底是在干嘛,但是我们可以从最后那个 if 语句获取一些重要的信息,那个Dest里面的字符串就是经过上面一系列的算法后得到的,而那个Str2是我们之前看到的可能和flag 有关的字符串,最后那个 v2 是 Dest字符串的长度,而这个strncmp函数是c语言里面的一个函数,它作用就是比较里面两个字符串,如果前面那个等于后面那个,就返回0,而这里的函数写到如果非strncmp.......就输出flag正确,说明这个就是比较我们输入的flag是否正确的语句,而Str2是程序中原本的字符串,我们输入的flag经过一系列计算之后就变成那个Dest,所以我们现在只需要解出算法,然后把那个程序中的字符串反着算,就能出来字符串了。

但是..... 最后我还是没能把算法解出来,然后到网上看了一下,原来上面那一段代码是base64加密,吐血。所以整个算法就是先将flag 进行base64加密,然后再进行下面那个循环算法就得出了最后的字符,然后再和程序中的字符进行比较。所以我们将程序中那个字符串反过来算,先写个脚本:

bugku第七个题目love

然后将结果字符串进行base64解密:

bugku第七个题目love

flag出来了。

总结:基础要打好