进入main,发现无法F5,提示栈帧错误,调整栈帧,可以正常反编译
可以明显看到输入的值拷贝到"v5",并且原始的值会经过wrong,omg两个函数,最后v5进入encrypt,该函数时一个自加密的函数,等v5不等与0的时候进入finally
这里发现,wrong,omg都是错误的路径,与解题并没有太大关系,encrypt与finally都没有办法正常分析,都是错误的函数,这里就要考虑解密自加密的函数了,算法比较简单,直接异或了0x41,这里直接使用idapython脚本Patch一下,就可以分析了
import idaapi addr = 0x401500 for i in range(0,186): re = Byte(addr+i) ^ 0x41 PatchByte(addr+i,re)
这里经过Patch的函数,进入里面将数据转换为代码(快捷键为“c”),这里用Editer->Function->delete Function -> create Function,ida默认识别的函数会有错误,因此删除再重新创建一个,最终两个函数可以正常分析
分析encrypt函数,需要让第一个式子成立,才能最终让输入的flag进入finally。
编写脚本,可以得到第一个式子的输入。
import idaapi addr = 0x404012 addr_d = 0x403040 re = "" for i in range(0,19): re = re + chr(Dword(addr_d+i*4) ^ Byte(addr+i)) print re //flag{d07abccf8a410c
这里发现接触来的输入是19个字符,与一开始要求输入的24个还差了5个。这时候进入分析finally。
可以看到给了5个值,但是都没用,这一段程序就是拿输入的第一个字符去参与if ( (*a1 != 0x25) == v72 )的判断,这是发现v72返回的是一个1~100的随机数,然而第一个字符不等于“%”时将等于1,然后再去与v72比较是否相等。
这个时候就陷入沉思了,发现这段代码并没由实际的作用,又分析了汇编,发现还是一样的逻辑。最后定位再了这5个值上,19+5==24刚好满足,最后猜测flag的最后一位时“}”,因此求出异或的值
最终flag拼接上就出来了