高校战“疫” 天津垓

查壳
高校战“疫” 天津垓_第1张图片
这个程序根据后面的分析是属于自解密一类的的程序,
这个程序在我电脑上跑不起来,搞了半天环境就是跑不起来
算了直接拖入IDA分析
进到入口函数
高校战“疫” 天津垓_第2张图片
然后进入sub_100401B2F
高校战“疫” 天津垓_第3张图片
接着进入sub_1004011F6(),这个函数是第一个key的check高校战“疫” 天津垓_第4张图片
解密代码

a = "Rising_Hopper!"
tt = [17,8,6,10,15,20,42,59,47,3,47,4,16,72,62,0,7,16]
tmp = []
for j in range(len(tt)):
	for i in range(32,127):
		if tt[j] == ~(i & ord(a[j%14])) & (i | ord(a[j%14])):
			tmp.append(i)
print(tmp)
#第一个key为Caucasus@s_ability
#[67, 97, 117, 99, 97, 115, 117, 115, 64, 115, 95, 97, 98, 105, 108, 105, 116, 121]

这个函数对用户第一个输入Str进行检测,然后如果不对就直接退出,那么会不会在别的地方也用到了Str,对Str进行交叉引用
高校战“疫” 天津垓_第5张图片
发现还有两个函数使用了Str,跟过去看下
高校战“疫” 天津垓_第6张图片
发现这个函数的作用应该是属于自解密的,这个函数有三个参数,再通过交叉引用,跟到上一层,看下他的三个参数分别是啥
高校战“疫” 天津垓_第7张图片
结合sub_100401506这个函数分析得知,第一个参数应该就是加密了的程序代码,第二个应该就是修改的字节数,第三个就是用户输入的那个第一个key;
而且sub_100401A6C这个函数最后还有对这个byte_10040164D进行函数调用的代码;代码段有一大段数据,这很不正常,说明这里的数据是被加密的函数
高校战“疫” 天津垓_第8张图片
高校战“疫” 天津垓_第9张图片
根据sub_100401506,写IDAPython脚本对byte_10040164D这段代码进行解密

a = [67, 97, 117, 99, 97, 115, 117, 115, 64, 115, 95, 97, 98, 105, 108, 105, 116, 121]
start = 0x10040164D
for i in range(1045):
    patch_byte(start+i,Byte(start+i) ^ a[i%18])

高校战“疫” 天津垓_第10张图片
在IDA中运行解密代码
然后回到byte_10040164D处,按C,把数据转换为代码
高校战“疫” 天津垓_第11张图片
接着按P,把这个段代码转换为函数
高校战“疫” 天津垓_第12张图片
然后此处就可以F5看伪代码了
高校战“疫” 天津垓_第13张图片
这里就是flag校验的逻辑代码
我写了个脚本进行爆破

a = """  v9 = 0x1EA272;
  v10 = 0x206FC4;
  v11 = 0x1D2203;
  v12 = 0x1EEF55;
  v13 = 0x24F111;
  v14 = 0x193A7C;
  v15 = 0x1F3C38;
  v16 = 0x21566D;
  v17 = 0x2323BF;
  v18 = 0x2289F9;
  v19 = 0x1D2203;
  v20 = 0x21098A;
  v21 = 0x1E08AC;
  v22 = 0x223D16;
  v23 = 0x1F891B;
  v24 = 0x2370A2;
  v25 = 0x1E558F;
  v26 = 0x223D16;
  v27 = 0x1C883D;
  v28 = 0x1F891B;
  v29 = 0x2289F9;
  v30 = 0x1C883D;
  v31 = 0xEB773;
  v32 = 0xE6A90;
  v33 = 0xE6A90;
  v34 = 0xE6A90;
  v35 = 0xB1CCF;
  v36 = 0x1C883D;
  v37 = 0x2289F9;
  v38 = 0x22D6DC;
  v39 = 0x223D16;
  v40 = 0x21566D;
  v41 = 0x21098A;
  v42 = 0x1EEF55;
  v43 = 0x1E558F;
  v44 = 0x223D16;
  v45 = 0x1C883D;
  v46 = 0x22D6DC;
  v47 = 0x1F3C38;
  v48 = 0x1D2203;
  v49 = 0x21098A;
  v50 = 0x1C883D;
  v51 = 0x24A42E;
  v52 = 0x1E558F;
  v53 = 0x223D16;
  v54 = 0x21566D;
  v55 = 0xD83E7;
  v56 = 0x21566D;
  v57 = 0x21098A;
  v58 = 0x1E558F;
  v59 = 0x258AD7;"""
import re
pt = re.compile(r"= (.*?);")
tmp = pt.findall(a)
flag = ""
for i in range(51):
	for j in range(32,127):
		if int(tmp[i],16) == (0x4ce3 * j % 0x8000000B):
			flag += chr(j)
			break
print(flag)
flag{
     Thousandriver_is_1000%_stronger_than_zero-one}

你可能感兴趣的:(CTF-REVERSE,安全,python)