攻防世界 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}

posted @ 2020-10-11 23:57  Sk2rw  阅读(150)  评论(0编辑  收藏  举报