首页 > 其他分享 >Tea总结(例题形式)

Tea总结(例题形式)

时间:2023-11-28 19:44:47浏览次数:38  
标签:总结 int Tea sum Buf2 result key 例题 uint32

Tea总结(例题形式)

[GDOUCTF 2023]Tea

老规矩,pe查壳,无壳64位,拖进IDA中
在Function模块中没有找到main函数,看看String里面有没有
发现了fake_flag,点进去看看image
发现sub,跟进image
看到以下内容image
发现sub_140011339中的sub_1400117D0有有用内容image
那么key的值就是key[]=
再跟进到sub_1400112B7下的sub_140011900函数,看到了tea加密

image

又跟进到sub_140011352下的sub_140011B60函数,得到加密后的数据

image

那么就可以开始编写脚本了
#include <stdio.h>
int main()
{
	int key[] = { 2233, 4455, 6677, 8899 };
	unsigned int result[10];
	result[0] = 0x1A800BDA;
	result[1] = 0xF7A6219B;
	result[2] = 0x491811D8;
	result[3] = 0xF2013328;
	result[4] = 0x156C365B;
	result[5] = 0x3C6EAAD8;
	result[6] = 0x84D4BF28;
	result[7] = 0xF11A7EE7;
	result[8] = 0x3313B252;
	result[9] = 0xDD9FE279;
	int dalte = 0xF462900;
	int i = 0;
	int wheel;
	int sum = 0;

	// 逆算法
	for (i = 8; i >= 0; i--) 
	{
		// 轮数
		wheel = 33;
		sum = dalte * (i + wheel);
		while (wheel--) 
		{
			sum -= dalte;
			result[i + 1] -= (sum + key[(sum >> 11) & 3]) ^ (result[i] + ((result[i] >> 5) ^ (16 * result[i])));
			result[i] -= sum ^ (result[i + 1] + ((result[i + 1] >> 5) ^ (16 * result[i + 1]))) ^ (sum + key[sum & 3]);
		}
	}
	for (i = 0; i <= 9; i++) 
	{
		printf("%x", result[i]);
	}
	return 0;
}
运行结果为image
一眼为16进制,转换一下image

[HGAME 2023 week1]a_cup_of_tea.exe

老规矩,pe查壳,无壳64位,拖进IDA中image

一来就看到了result,点进sub_1400010B4看到了tea模块image
key值在这里面
image
拿到一串16进制数,闫师傅直接上手操作,ddddddd
image
解密为
image
得到key为[0x12345678, 0x23456789, 0x34567890, 0x45678901]
编写脚本
#include<stdio.h>
void decrypt(unsigned int* a1, long long* a2)
{
	int v2; // ebx
	long long v3; // r11d
	int v4; // edi
	int v5; // esi
	int v6; // ebp
	unsigned int v7; // r9d
	int v8; // rdx
	unsigned int v9; // r10d

	v2 = *a2;
	v3 = 0;
	v4 = a2[1];
	v5 = a2[2];
	v6 = a2[3];
	v7 = *a1;
	v8 = 32;//wheel
	v9 = a1[1];
	v3 = -(1412567261 * 32);
	do
	{
		v9 -= (v3 + v7) ^ (v5 + 16 * v7) ^ (v6 + (v7 >> 5));
		v7 -= (v3 + v9) ^ (v2 + 16 * v9) ^ (v4 + (v9 >> 5));
		v3 += 1412567261;
		--v8;
	} while (v8);
	*a1 = v7;
	a1[1] = v9;
}

int main()
{
	long long key[4] = { 0x12345678,0x23456789,0x34567890,0x45678901 };
	unsigned int Buf2[8] = { 0 };
	Buf2[0] = 0x2E63829D;
	Buf2[1] = 0xC14E400F;
	Buf2[2] = 0x9B39BFB9;
	Buf2[3] = 0x5A1F8B14;
	Buf2[4] = 0x61886DDE;
	Buf2[5] = 0x6565C6CF;
	Buf2[6] = 0x9F064F64;
	Buf2[7] = 0x236A43F6;
	for (int i = 0; i < 8; i += 2)
	{
		decrypt(Buf2 + i, key);
	}
	char* p = (char*)Buf2;
	for (int j = 0; j < 8 * 4; j++)
	{
		printf("%c", *(p + j));
	}
}

image

[MoeCTF 2022]ezTea

做完以后发现这个题才是最好入手的TEA题
下载下来后有两个东西,一个pdf一个C源码,打开来看看image
这里我们得知它的result为【0x17, 0x65, 0x54, 0x89, 0xed, 0x65, 0x46, 0x32, 0x3d, 0x58, 0xa9, 0xfd, 0xe2, 0x5e, 0x61, 0x97, 0xe4, 0x60, 0xf1, 0x91, 0x73, 0xe9, 0xe9, 0xa2, 0x59, 0xcb, 0x9a, 0x99, 0xec, 0xb1, 0xe1, 0x7d】再来看看C源码

image

看到了tea模块和key值
那我们就开始编写脚本
#include<stdio.h>
#include <stdint.h>
void decrypt(uint32_t* v, uint32_t* k)
{
	uint32_t delta = 0xd33b470;
	uint32_t v0 = v[0], v1 = v[1], sum = delta * 32;
	for (int i = 0; i < 32; i++)
	{
		v1 -= ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]);
		v0 -= ((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]);
		sum -= delta;
	}
	v[0] = v0;
	v[1] = v1;
}
int main()
{
	uint32_t k[4] = { 1, 2, 3, 4 };
	int8_t input[33] =
	{
		0x17, 0x65, 0x54, 0x89, 0xed, 0x65, 0x46, 0x32, 0x3d, 0x58, 0xa9, 0xfd, 0xe2, 0x5e,
		0x61, 0x97, 0xe4, 0x60, 0xf1, 0x91, 0x73, 0xe9, 0xe9, 0xa2, 0x59, 0xcb, 0x9a, 0x99,
		0xec, 0xb1, 0xe1, 0x7d
	};
	for (int i = 0; i < 32; i += 8)
	{
		uint32_t v[2] = { *(uint32_t*)&input[i], *(uint32_t*)&input[i + 4] };
		decrypt(v, k);
		for (int j = 0; j < 2; j++)
		{
			for (int k = 0; k < 4; k++)
			{
				printf("%c", v[j] & 0xff);
				v[j] >>= 8;
			}
		}
	}
	return 0;
}
运行得到

image

这道题应该放在最前面做才对,因为基础。

[FSCTF 2023]Tea_apk

一道java逆向tea
用jadx打开,看到以下内容

image

但感觉不像平常的TEA加密,无从下手。网上看了看wp发现这个是XXTEA加密,震惊!
用工具可以直接解开

image

总结

TEA加密需要先找到四个模块,1-key值,2-tea模块,3-加密后的数据(包括delta),4-wheel,然后就可以进行逆向工程了
脚本先添加key数组,unsigned int result数组,添加变量i,wheel(轮数),sum(和),dalte。然后开始写逆算法。
有个关于tea加密的学习链接,学习资料
仅供参考

标签:总结,int,Tea,sum,Buf2,result,key,例题,uint32
From: https://www.cnblogs.com/kelec0ka/p/17862793.html

相关文章

  • 【Python进阶】第7篇:TCP和socket客户端程序开发。总结md文档集合(已分享,附代码)
    本文从14大模块展示了python高级用的应用。分别有Linux命令,多任务编程、网络编程、Http协议和静态Web编程、html+css、JavaScript、jQuery、MySql数据库的各种用法、python的闭包和装饰器、mini-web框架、正则表达式等相关文章的详细讲述。全套笔记和代码自取地址:请移步这里感......
  • 注册Steam账号无响应的解决办法,教你怎么提供Steam的人机图片验证
    Steam注册问题解决办法分享注册Steam时进行人机身份验证,总是有一堆图片验证不完,点【继续】后上方弹出【您对CAPTCHA的响应似乎无效。请在下方重新验证您不是机器人。(引用ID:3811775249663914774)】的提示。】按照网上的方法,重复更换了浏览器和设备都无效,遇到这种提示应该怎么办......
  • linux常见命令总结
    学习Linux已经10多个星期了,所以想总结一下,以便于复习1.Linux管理文件和目录的命令1.1pwd命令该命令的英文解释为printworkingdirectory(打印工作目录)。输入pwd命令,Linux会输出当前目录。1.2cd命令cd命令用来改变所在目录。cd/转到根目录中cd~转到/home/us......
  • numpy常见操作总结
    1.计算一个list的平均值importnumpyasnp#创建一个包含数字的列表my_list=[1,2,3,4,5]#使用numpy.mean()函数计算平均值average=np.mean(my_list)print("平均值:",average)2.numpy数组查看尺寸在NumPy中,您可以使用.shape属性来查看数组的尺寸(维度大......
  • 十二周课堂总结
    7.2基本分区7.2.1添加新硬盘用lsblk查看硬盘,如下所示: 采用MBR分区表形式创建分区,可使用fdisk命令,添加“-l”参数可以查看系统所挂硬盘个数及分区情况,具体如下所示: 比较sda与sdb的区别,具体如下所示: 使用fdisk命令对sdc硬盘进行分区,然后输入不同的参数来创建分区,具体......
  • 编辑原理总结
    编译原理第一章引言1.从面向机器的语言到面向人类的语言汇编指令:用符号表示的指令被称为汇编指令汇编语言:汇编指令的集合称为汇编语言2.语言之间的翻译转换(也被称为预处理):高级语言之间的翻译,如FORTRAN到ADA的转换编译:高级语言可以直接翻译成机器语言,也可以翻译成汇编语......
  • vue3 项目中出现的空白页面的总结(巨坑)
    一、背景开局先说一句!!!!好坑!!!!!,我遇到的空白页面的问题,不是路由懒加载的原因,是在点击路由完整的状态下,点击菜单跳转页面,出现的空白页面,不能触发页面中任何钩子函数,但是路由是跳了的,重新刷新页面,页面内容即可出现,而且空白出现率相当高。打开浏览器控制台和项目控制台都不报......
  • Java语言基础知识全总结
    一.Java的优点1.      跨平台性。一次编译,到处运行。Java编译器会将Java代码编译成能在JVM上直接运行的字节码文件,C++会将源代码编译成可执行的二进制代码文件,所以C++执行速度快2.      纯面向对象。Java所有的代码都必须在类中书写。C++兼具面向对象和面向过程的特......
  • linux的期末总结
    简介Linux是目前最流行的操作系统之一,在服务器、桌面、移动等领域都有广泛的应用。为了深入了解Linux内核的运行机制,我参加了学校的Linux内核分析课程。通过八周的学习,我对Linux内核有了比较深入的了解,并在以下几个方面取得了进步:掌握了Linux内核的基本概念和结构理解......
  • Linux课堂知识总结
    这是学习Linux的第五节课,老师跟我们讲述了Linux的进程管理操作。程序(program)是一个普通文件,是为了完成特定任务而准备好的指令序列与数据的集合,这些指令和数据以“可执行映像”的格式保存在磁盘中。例如:hello.c源程序文件经过编译后产生a.out程序,其中a.out文件为可执行镜像格式......