【BaseCTF】TEA逆向

admin 2024年9月26日13:23:12评论26 views字数 2547阅读8分29秒阅读模式

打BaseCTF时候遇到一个Tea的逆向,刚好以前没做过趁这次比赛总结一下吧

先写一下网上找Tea的加解密轮子

#include <stdio.h>
#include <stdint.h>
 
//加密函数
void encrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], sum=0, i;           /* set up */
    uint32_t delta=0x9e3779b9;                     /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];   /* cache key */
    for (i=0; i < 32; i++) {                       /* basic cycle start */
        sum += delta;
        v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
    }                                              /* end cycle */
    v[0]=v0; v[1]=v1;
}
//解密函数
void decrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i;  /* set up */
    uint32_t delta=0x9e3779b9;                     /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];   /* cache key */
    for (i=0; i<32; i++) {                         /* basic cycle start */
        v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
        v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        sum -= delta;
    }                                              /* end cycle */
    v[0]=v0; v[1]=v1;
}
 
int main()
{
    uint32_t v[2]={1,2},k[4]={2,2,3,4};
    // v为要加密的数据是两个32位无符号整数
    // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
    printf("加密前原始数据:%u %un",v[0],v[1]);
    encrypt(v, k);
    printf("加密后的数据:%u %un",v[0],v[1]);
    decrypt(v, k);
    printf("解密后的数据:%u %un",v[0],v[1]);
    return 0;
}

然后来看这道题,对应上轮子这里的main函数定义了5组v和1组k,也就是每次拿两个v丢进去解密,然后解5次就好了

【BaseCTF】TEA逆向

点进enc函数继续和轮子比较一下,看到有变化的地方就是把sum或者说delta的值变了,里面的v1<<4+k0被写成了16*v1+k0

【BaseCTF】TEA逆向

按着轮子的解密函数把关键部分替换一下,注意轮子的解密函数里sum没写怎么来的,其实可以由sum=delta<<5计算而来,不是写死的。

#include <stdio.h>
#include <stdint.h>
 

//解密函数
void decrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], i;
    uint32_t delta=0x114514;
    uint32_t sum=delta<<5;
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];
    for (i=0; i<32; i++) {
        v1 -= (16*v0 + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
        v0 -= (16*v1 + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        sum -= delta;
    }  
    v[0]=v0; v[1]=v1;
}
 
int main()
{
    uint32_t v[2]={0x94B1F1E7,0x21D5D352},k[4]={0x11223344,0x55667788,0x99AABBCC,0xDDEEFF11};
    // v为要加密的数据是两个32位无符号整数
    // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
    //printf("加密前原始数据:%u %un",v[0],v[1]);
    //encrypt(v, k);
    printf("加密后的数据:%u %un",v[0],v[1]);
    decrypt(v, k);
    printf("解密后的数据:%u %un",v[0],v[1]);
    return 0;
}

解密后的数据:1702060354 2068206659

最后利用python将十进制数字转换成字符串就行了

【BaseCTF】TEA逆向

参考资料:

逆向算法之TEA算法

Tea系列算法及Tea系列算法在IDA中的识别

原文始发于微信公众号(智佳网络安全):【BaseCTF】TEA逆向

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年9月26日13:23:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【BaseCTF】TEA逆向https://cn-sec.com/archives/3114667.html

发表评论

匿名网友 填写信息