[GDOUCTF 2023]Tea

发布时间 2023-11-19 23:31:13作者: 努力的大魔王

里面的函数很多,然后还没有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要最先放上来