查壳:
没壳,跑一下看看:
经典输入处理判断,扔进IDA看一看:
框架比较简单,但是简单的框架内容可不一定简单。
一些API函数,念着英文就知道什么意思了。看一下读取数据的函数:
中规中矩的,把读入的’\n’和’\r’过滤一下。
看一下处理和判断的函数:
大体逻辑是这样的:
v0是长度,v4是一个给定的数值。循环处理flag,将其倒序与v4亦或的结果保存,替换v4内容,继续下一位。
由于结果已经给出了,我们要做的就是逆向写一遍这个算法。但是我们缺少v4的内容,不知道v4就不知道其他位置的flag。
关于v4的这个函数sub_401000,我们不能立马得到结果:
这是一个没见过的函数,具体处理也不是很懂。
这里其实可以用od看一下运算结果,但是我用不熟od,好歹拖进去看一下:
这里调用了401000函数,然后把al存了起来。
手动计算401000:
Eax和edx存入0x80070057。Ax异或,eax左移4,ax右移1。
这里注意eax是32位而ax是16位,ax取0x0057,rol循环左移不舍弃,shr右移舍弃高位0补足。得到的结果是0x0x700004
然后al是8位,也就是04,所以v4 = 4;(老实说我并不明白这里为什么v4就是al的值)
逆向算法:
结果: