【BaseCTF】TEA逆向

打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逆向

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/300734.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!