查壳
这个程序根据后面的分析是属于自解密一类的的程序,
这个程序在我电脑上跑不起来,搞了半天环境就是跑不起来
算了直接拖入IDA分析
进到入口函数
然后进入sub_100401B2F
接着进入sub_1004011F6(),这个函数是第一个key的check
解密代码
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进行交叉引用
发现还有两个函数使用了Str,跟过去看下
发现这个函数的作用应该是属于自解密的,这个函数有三个参数,再通过交叉引用,跟到上一层,看下他的三个参数分别是啥
结合sub_100401506这个函数分析得知,第一个参数应该就是加密了的程序代码,第二个应该就是修改的字节数,第三个就是用户输入的那个第一个key;
而且sub_100401A6C这个函数最后还有对这个byte_10040164D进行函数调用的代码;代码段有一大段数据,这很不正常,说明这里的数据是被加密的函数
根据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])
在IDA中运行解密代码
然后回到byte_10040164D处,按C,把数据转换为代码
接着按P,把这个段代码转换为函数
然后此处就可以F5看伪代码了
这里就是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}