TEA算法解题(中) | 申博官网
登录
  • 欢迎进入Sunbet!
  • 如果您觉得Sunbet对你有帮助,那么赶紧使用Ctrl+D 收藏Sunbet并分享出去吧
  • 您好,这里是Sunbet!

TEA算法解题(中)

Sunbet_行业观察 申博 281次浏览 已收录 0个评论

媒介

风好大,我好冷,测验凉凉

继承进修Tea算法。

解题

全部顺序的逻辑功用也未几诠释,在上一篇已对照完全的引见了功用,我们直接找到输入的字符串和encrypt函数。

TEA算法解题(中)

TEA算法解题(中)

然后这里的sub_401950也就是htoi函数将字符串转化为数字。
在挪用sub_400840函数之前能够视察一下参数
(在调试的历程当中IDA crush 了频频,以是有些截图的地点会有分歧)

TEA算法解题(中)

TEA算法解题(中)

TEA算法解题(中)

个中rsi这个参数像是128位的key,同时注意下小端序,不要把本身弄糊涂了。

然后F7跟进,下断。

初始化阶段,个中有一个常量0x9e3779b9.(一看就是Tea加密)

TEA算法解题(中)

然后是一个0x20的轮回

TEA算法解题(中)

以后能够来到loc_4009FF下,能够看到许多敏感的操纵。

TEA算法解题(中)

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

shl edi, 4shr edi, 5和一些xor

此时我们的数据在这里。

TEA算法解题(中)

然后单步跟一遍个中发明了之前辨认出来的key

TEA算法解题(中)

和终究的数据转变以下:

TEA算法解题(中)

好吧,这么看基础看不出数据是经由如何的运算,若是要逆向算法那末只能细致的去推加密历程,不外我们只需能笼统出该加密历程的特性便可。

继承F9,在次轮回,此时的数据转变以下:

TEA算法解题(中)

此时的数据特性能够做以下总结:

有一个特性量
三个累加量
一个key
每轮运算将中间量举行运算累加到sum

继承往下,去掉断点,运转完全部轮回,能够发明,函数末了将个中两个累加量赋值给了我们传入的参数。

TEA算法解题(中)

那末至此该算法也就剖析终了了,特性以下。

  1. 特性量:0x9e3779b9
  2. key 128 bit {2,2,3,4}
  3. 传入两个32位无标记整数
  4. 三个累加量,个中末了赋值给传入的参数
  5. 存在<<4 , >>5 , xor等操纵

实在简朴点记的话就只需记着特性量,不外我的发起当然是本身去跟一遍。
Tea系列算法背面另有xTea&xxTea都在Tea的基础上举行了革新,数据的特性相似,然则加入了更多的移位和异或运算。

解题代码

明白思绪以后就会发明实在解密很简朴,不外这里仅仅是为了进修Tea算法,一样平常竞赛见到的问题不会这么简朴。

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.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 k[4]={2,2,3,4};
    // v为要加密的数据是两个32位无标记整数
    // k为加密解密密钥,为4个32位无标记整数,即密钥长度为128位

    //exchange scale
    uint32_t flagLong[2];
    flagLong[0] = 0x67d7b805;
    flagLong[1] = 0x63c174c3;
    decrypt(flagLong,k);
    printf("flag{%x-%x}\n",flagLong[0],flagLong[1]);

    return 0;
}

总结

至此我们又控制了一种加密要领。高兴


Sunbet|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明TEA算法解题(中)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址