里面的函数很多,然后还没有main函数,这个时候从字符串那里寻找线索了
根据tea算法的知识我们可以猜测图中的v7应该是加密的密钥
然后看sub_140011339函数,发现主要的逻辑就是给v7的值换个位置而已,然后v7的值变为2233,4455,6677,8899
sub_140011145函数,功能就是将v8的值附到v9
然后sub_1400112B7函数的主要的功能就是tea加密的操作了
经过分析
*(_DWORD *)(a1 + 4i64 * i) += sum ^ (*(_DWORD *)(a1 + 4i64 * v3)+ ((*(_DWORD *)(a1 + 4i64 * v3) >> 5) ^ (16 * *(_DWORD *)(a1 + 4i64 * v3)))) ^ (sum + *(_DWORD *)(key + 4i64 * (sum & 3))); *(_DWORD *)(a1 + 4i64 * v3) += (sum + *(_DWORD *)(key + 4i64 * ((sum >> 11) & 3))) ^ (*(_DWORD *)(a1 + 4i64 * i)+ ((*(_DWORD *)(a1 + 4i64 * i) >> 5) ^ (16 * *(_DWORD *)(a1 + 4i64 * i)))); 经过还原后,大致代码如下所示: a1[i] += sum ^ (a1[v3] + ((a1[v3] >> 5) ^ (a1[v3] << 4)) ^ (sum + key[sum & 3]) a1[v3] += (sum + key[(sum >> 11) & 3] ) ^ (a1[i] + (a1[i] >> 5) ^ (a1[i] << 4)) 这里的*16其实就相当于<<4,因为左移N位,相当于乘以2^N次方.
所以对于本题的话是魔改的XTEA算法,就是对密文一共10组,每二组(i和i+1)进行一次加密,加密轮次为33轮,delta为0xF462900
然后对于sub_140011352函数就是对加密后的内容进行对比
那么最后写出来的脚本应该是
#include <stdio.h> #include <stdint.h> #define delta 0xF462900//题目中的魔改数值 int main() { uint32_t key[4] = {2233,4455,6677,8899};//密钥 uint32_t Data[10] = { 0x1A800BDA ,0xF7A6219B ,0x491811D8,0xF2013328,0x156C365B, 0x3C6EAAD8,0x84D4BF28,0xF11A7EE7,0x3313B252,0xDD9FE279 };//密文 unsigned int j; int i; unsigned int sum; for (i = 8; i >= 0; i--) { j = 33; sum = delta * (i + j);//注意乘的数值 while(j--) { sum -= delta;//注意是减号,而且放的位置也要注意 Data[i + 1] -= (sum + key[(sum >> 11) & 3]) ^ ((Data[i] + ((Data[i] >> 5) ^ (Data[i] << 4)))); Data[i] -= sum ^ (Data[i + 1] + ((Data[i + 1] >> 5) ^ (Data[i + 1] << 4))) ^ (sum + key[sum & 3]); } } for (int i = 0; i < 10; i++) { printf("%x", Data[i]); } return 0; }
注意:
- 对Sum进行处理时,是33+i轮次。33代表的是内部对数据的总加密轮次。外部是对每数据二二一组加密的轮次
- for循环需要逆算法来,从8迭代到0.
- while循环中,+=变-=即可,其他不变。
- 加密时顺序sum+=delta要最先放上来