[FlareOn2]very_success
好题
IDA打开一共就3个函数。。。
找到关键代码
这里要注意各个变量所存的值
重点在
v13 = *v7 == (unsigned __int8)v12;
这是check判断
v12是rol后+v10+v11得到
而v10跟v8有关 v8=a3++ 所以v12可以反推flag
这里check了v12和v7相等 但是静态分析是找不出v7的值的
注意v7<=>edi 下断点调试
这里注意 要输入>=37个字符(。。。)
然后调试会发现是先运行__writeeflags
后的v12=...再回调__writee
这是查看edi的值 已经可以得到v7了
shift+E导出为byte即可
接下来就是分析一下这个_ROL1_
将汇编与源代码比对可以发现
这里的ah有关联!上面rol传的 1 v5&3 所以下面未定义的v12对应的ah值也是1!!!
然后这里的rol是一个循环左移
这里逆向的思路就是模拟它每次循环左移
用已知的v12(==v7)得到rol()+v11+v10
v11=1 rol()=... =>v10
而v10=v15^v8
v15=result v8=flag 就可以逆向得到flag了
只是这里注意result异或后要取&0xff 因为v10是char类型!细节!
还有个点 WP都是逆序得flag的 但这哪里看得出来逆序呢???
先贴着吧
solution.py
def rol(value, count):
temp=((value>>(8-count))&0xFF)|((value<<count)& 0xFF)
return temp
v7=[0xAA, 0xEC, 0xA4, 0xBA, 0xAF, 0xAE, 0xAA, 0x8A, 0xC0, 0xA7,0xB0, 0xBC, 0x9A, 0xBA, 0xA5, 0xA5, 0xBA, 0xAF, 0xB8, 0x9D,0xB8, 0xF9, 0xAE, 0x9D, 0xAB, 0xB4, 0xBC, 0xB6, 0xB3, 0x90,0x9A, 0xA8]
flag=''
v4=0
for i in range(len(v7)):
flag+=chr(((v7[len(v7)-i-1]-rol(1,v4&3)-1)^0x1C7)&0xff)
v4+=v7[len(v7)-i-1]
print('flag{'+flag+'n.com}')
可以看见除了i顺序的问题 其余都已经弄清楚了 感觉这个顺序怕不是又是奇妙的小端序???
这题的重点在于通过调试与汇编代码比对得到关键变量数据!