打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次就好了
点进enc函数继续和轮子比较一下,看到有变化的地方就是把sum或者说delta的值变了,里面的v1<<4+k0
被写成了16*v1+k0
按着轮子的解密函数把关键部分替换一下,注意轮子的解密函数里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将十进制数字转换成字符串就行了
参考资料:
逆向算法之TEA算法
Tea系列算法及Tea系列算法在IDA中的识别
原文始发于微信公众号(智佳网络安全):【BaseCTF】TEA逆向
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论