JustRe
初步分析
使用32位的IDA打开文件
按 shift+F12
搜索字符串,找到了带有 flag{%.26s}
字样的字符串。根据交叉引用找到该字符串被引用的代码段
发现 test eax,eax
这句代码上方的代码IDA识别不出来。按下 [space]
,查看上方的代码是什么样的
我们发现它调用了这个函数,跟进去看一下
发现端倪了,这里使用了 SMC 技术。那么返回,查看上方的函数调用
经过分析,得知 sub_401CE0
的作用是获取输入;sub_401610
的作用就是对函数 sub_4018A0
进行解密
在 sub_401610
中看到这两个调用
GetCurrentProcess
的作用是获取当前进程的一个伪句柄
WriteProcessMemory
的作用就是向进程的指定偏移写入内容
在这两个调用的上方就是解密的过程,其内使用了大量的 xmm
寄存器,IDA与OD都不能很好地识别这些指令,于是就转战x64debug
分析SMC解密函数
在 401C2C
处下断点,根据 ECX
的值得到了输入在内存中的位置,同时得知输入将会在 sub_401610
被使用
跟进函数一步步查看,就得到了函数的逻辑:
-
将输入的前八位转换成数字,比如输入为 “12345678” ,就将它转换为 0x12345678,将其看作Num_0
-
将转换后的数字拓展到128位,比如将 0x12345678 拓展为 0x12345678123456781234567812345678,将其看作Num_1
-
将输入的第 9、10 位转换成数字,比如 “90” 转换成 0x90
-
将转换后的数字拓展到128位,比如 0x90 拓展为 0x90909090909090909090909090909090,将其看作Num_2
-
在
403040
有一个表,表中有总共 128 * 4 字节的数据,将其看作数组A,共四项,每项128字节
405018
有一个表,该表有总共 128 * 6 字节的数据,将其看作数组B,共六项,每项128字节,其中每项也是一个数组,该数组每项32字节
-
进行如下运算
-
B[0] = ( B[0] + Num_2 ) ^ ( A[0] + Num_1 )
-
B[1] = ( B[1] + Num_2 ) ^ ( A[0] + A[1] + Num_1 )
-
B[2] = ( B[2] + Num_2 ) ^ ( A[0] + A[2] + Num_1 )
-
B[3] = ( B[3] + Num_2 ) ^ ( A[0] + A[3] + Num_1 )
-
-
将输入的第 9、10 位拓展到32位,就此例,0x90 拓展为 0x90909090,将其看作 Num_3
-
进行如下运算