获得文件后,先运行一下看看
由此推测,正确的flag被输入之后会有不同的输出。
进入IDA查看
主要涉及到的操作,通过key和输入的字符v8进行异或计算,算出来的v7赋值给v4后自减。一直在里面的循环继续,把s的值赋成1。直到v4<=0时候就跳出里面的循环,把s数组第v5个元素赋值成0。所以第几个元素,始终跟v11有关,对于每一个字符,从异或后的ascii码自减,有多少个就写多少个1,写完了写一个0,然后再继续下一次。这时候再V9自增,使用key后面的一个字符进行异或。进行同样的操作。直到输入回车结束,跳出循环,把剩余的元素用-1补全。
明白了这个我们就可以反推出输入的flag。先去看判断条件r!=s,直接去找r数组。
shift+e导出,果然是有1有0,最后全都是-1,印证了我们的猜想
然后再看一下key,果然是四个字符,没有问题。和%4相对应。
接下来就可以反向编写我们的程序来获取flag了,其实非常简单,就是用1的个数来算出每一个字符的ascii并输出。遍历一下就可以,写1和0的条件,-1直接不管 因为没有意义。
运行一下就出结果了