攻防世界 reverse IgniteMe
扔进IDA里,shift+F12
查看strings window。找到字符串 Give me your flag:
被引用的地方在函数main里头。F5查看伪代码。
很明显可以看出,用户输入的长度必须大于4且小于30,以 EIS{
开头,以 }
结尾。并且,在sub_4011C0函数中,对用户的输入进行了校验
跟进sub_4011C0函数中。首先把用户输入从下标为[4]开始的字符(不包括最后一个字符)赋值给数组v8,v4全部用0填充,这里的v4,从最后一行来看,就是最后从用户输入变换后得到的字符串,并且用户输入中在EIS{}中间的字符数应该为24个字符。
接下来对于v8中的每个字符v8[i]:
- 如果v8[i]为小写,则转成大写;
- 如果v8[i]为大写,则转成小写;
然后v4[i] = byte_4420B0[i] ^ sub_4013C0(v8[i]); = byte_4420B0[i] ^ ( (v8[i] ^ 85) + 72 )
。
其中, byte_4420B0的内容为:0D 13 17 11 02 01 20 1D 0C 02 19 2F 17 2B 24 1F 1E 16 09 0F 15 27 13 26
1 flag='EIS{'c='GONDPHyGjPEKruv{{pj]X@rF'for i in range(24):
tmp=ord(c[i])^Byte(key+i)
tmp=(tmp-72)^0x55
if 97 <= tmp <= 122:
tmp-=32
if 65 <= tmp <= 90:
tmp+=32
flag+=chr(tmp)flag+='}'
print flag
解出flag为EIS{wadx_tdgk_aihc_ihkn_pjlm}