ida32打开,进入main函数
查看验证函数
str1变量未知,str2是一个明文,还有一个表,猜测跟base64有关
找了半天没有找到加密的地方,逻辑也不是很清楚,中间发现几个函数有异或的操作,初步猜测异或加密和base64加密。运行文件
这时候就怪起来了,程序会有一个弹窗,说明程序会调用一个messagebox,并且有successed和hooked的字符串,但是我们在分析中并未发现这两个字符串。直接动调。
我直接好家伙,为什么跟之前静态分析的不一样呢,经过看大佬的wp才知道是一个hook的操作。hook技术就是在程序运行的时候通过几种技术手段来改变程序流程走向操作者指定的函数,常见的是在调用api函数时,会先运行操作者的函数,然后再进入到原本应该调用的函数上。
这里有个数组,是将数据进行大小写转换。
进入handler函数发现一串字符串,并进入sub_841172函数
一直跟进函数,发现这样一组数据。
到现在还是不太明白,看大佬wp说这是sm4加密,草率了,磕一个。之前的那一串字符串就是密钥了
返回函数查看SetUnhandledExceptionFilter调用的函数。
可以看出先对str2数组的数据进行了前后调换的操作。进入str1的函数。
好吧看不太懂,再次查看大佬的wp说这就是对输入得数据进行SM4加密。在对数据处理的最后一部分,sub_8410FF函数可以理解为是对base64表的转换,将表向右移动了24位。
所以这道题的逻辑就是先将输入进行sm4加密,加密之后进行改表的base64加密,之后将生成的数据前后互换再与str2进行交换。
贴出脚本
1 import base64 2 base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' 3 diy_base = 'yzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/abcdefghijklmnopqrstuvwx' 4 #这里是用的已经完全改变后的变表,其中把+24当作表的移动来理解 5 s = 'U1ATIOpkOyWSvGm/YOYFR4!!' 6 ss = '' 7 for i in range(len(s)-2): 8 ss += base[diy_base.find(s[i])] 9 ss += '==' 10 a = base64.b64decode(ss) 11 print(list(map(hex,a)))
flag{SM4foRExcepioN?!}