CTF Reverse Igniteme.exe解题思路
一、文件描述
- 程序运行,提示输入flag;
- 随便输入一串字符串后,程序终止退出;
二、解题思路
- 主函数中,先是判断输入的序列长度是否在(4, 30)之间,然后判断flag的头部是否为“EIS{”,以及Str[28]的值是否为125,,当这三个条件都满足时,就进入sub_4011C0中。
- 在sub_4011C0中,从Str[4]开始到倒数第二位进行字符的混淆。最关键的一步是在33行的Xor操作,最后Str2[i]='GONDPHyGjPEKruv{{pj]X@rF’。
- 这个逆向没什么难度,,根据Str2[i]可以得到v8[i]。
4.从26~31行是对v8[i]的混淆,通过v3=1或者v3=0对v8[i]加32或者减32,这里逆向思路也很简单,我们可以判断v8[i]的值属于哪个区间,具体步骤为:
if v8[i]+32 in range(97, 123):
v8[i] += 32
elif v8[i]-32 in range(65, 91):
v8[i] -= 32
else:
v8[i] = v8[i]
- 所以整体的逆向脚本为:
import numpy as np
string = 'GONDPHyGjPEKruv{{pj]X@rF'
word = [0x0D, 0x13, 0x17, 0x11, 0x02, 0x01, 0x20, 0x1D, 0x0C, 0x02, 0x19, 0x2F, \
0x17, 0x2B, 0x24, 0x1F, 0x1E, 0x16, 0x09, 0x0F, 0x15, 0x27, 0x13, 0x26, 0x0A, \
0x2F, 0x1E, 0x1A, 0x2D, 0x0C, 0x22, 0x04]
string = list(string)
word = list(word)
str = np.zeros(24)
for i in range(24):
tmp = ord(string[i]) ^ ord(chr(word[i]))
tmp -= 72
tmp ^= 0x55
if tmp+32 in range(97,123):
v8 = tmp+32
elif tmp-32 in range(65, 91):
v8 = tmp - 32
else:
v8 = tmp
str[i] = v8
flag = ''
for i in str:
flag += (chr(int(i)))
print('EIS{'+flag+'}')
- 代码拙劣,,看结果就好,,,
- OD中验证下结果,flag正确没错咯!
- FLAG:EIS{wadx_tdgk_aihc_ihkn_pjlm}
- 逆向小白,,纯属记录下解题思路,,持续更新中哦~