April_Note
tea,xtea,xxtea
在逆向过程中,常常会遇到tea加密,本文将系统地总结一下tea,xtea,xxtea
tea
简介
TEA加密算法是一种分组密码算法,其明文密文块为64比特,密钥长度为128比特。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密是不同,该加密算法的迭代次数可以改变,建议的迭代次数为32轮。
值得一提的是Delta值一般为0x9E3779B9(-0x61C88647),这是判定TEA加密的特征之一
代码实现
1 |
|
示例
1 |
|
xtea
简介
XTEA是TEA的扩展,与TEA相比,XTEA使用更长的密钥和更多的迭代轮数,从而提高了安全性。XTEA使用128位密钥和64位块大小,而TEA使用64位密钥和64位块大小。
代码实现
1 |
|
示例
1 |
|
xxtea
简介
XXTEA使用更复杂的运算方式,它的块大小可以是任意的,密钥也可以是任意长度的。在加密时,XXTEA会对明文进行分块,然后每个块都会进行加密,加密后的结果再进行拼接,最终形成密文。在解密时,XXTEA会对密文进行分块,然后每个块都会进行解密,解密后的结果再进行拼接,最终形成明文。
代码实现
1 |
|
示例
1 |
|
逆向中TEA系列加密的识别
解决逆向题大部分出现TEA的场合都是 识别算法->编写对应解密程序
分析二进制文件中的算法的时候有几个识别的特征
- 可能存在针对64bit以及128bit数字的操作(输入的msg和key) ,一般会用无符号的32位的数组表示
- 存在先进行位移,然后异或的类似操作((z>>5^y<<2) 这类混合变换)(z>>5^y<<2)就是xxtea加密了,存在(v0 << 4) 和 **(v0 >> 5)**移位就是tea和xtea加密了
- 前面一个复杂的混合变换的结果可能会叠加到另一个值上,两者相互叠加(Feistel 结构)
- 获取密钥的时候,会使用某一个常量值作为下标(key[(sum>>11) & 3])存在轮换的方式获得密钥 就是xtea或者xxtea了
- 会在算法开始定义一个delta,并且这个值不断的参与算法,但是从来不会受到输入的影响(delta数值如果没有魔改就是0x9e3779b9)如果出现了0x9e3779b9这个数字一般就能确定是TEA加密系列
例题
[GDOUCTF2023]tea
查壳是64位无壳,ida64直接查看字符串
交叉引用一下you are right,定位到关键函数
1 | __int64 sub_140016230() |
简单分析如上,重点看一下xtea加密函数
1 | __int64 __fastcall sub_140011900(__int64 a1, __int64 a2) |
32次迭代的变体xtea加密,可以看出来delta值被魔改了,是v6=256256256
exp
1 | def xtea_decrypt(data,key): |
有个地方要特别注意的就是读入的v8是16进制无符号32位整数
如果不进行& 0xffffffff
,运行结果是乱码
这耗费了我好多时间检查,问题出在C和Python对无符号整数的处理方式不同。在C中,当无符号整数溢出时,它会回绕到0。但是,在Python中,当整数溢出时,它们会自动升级为长整数。所以需要通过& 0xffffffff
来保证解密出来是无符号32位整数。
最终运行结果HZCTF{hzCtf_94_re666fingcry5641qq}
根据题目要求flagNSSCTF{hzCtf_94_re666fingcry5641qq}
Python中PIL库中的Image类
逆向中可能会遇到有关图像的问题,总结了一些Python的PIL库中的Image类的一些函数,通过这些函数可以对数据进行一系列操从而得到我们想要的图片
函数 | 参数 | 作用 | 使用举例 |
---|---|---|---|
new | mode, size, color | 新建图像 | Image.new(‘RGB’, (200, 100), ‘red’) |
open | image_name | 加载图像 | img = Image.open(‘cat.jpg’) |
save | file_name, file_format | 保存图像 | img.save(‘picture.jpg’) |
crop | (left, upper, right, lower) | 裁剪图片 | crop_img = img.crop((420, 150, 860 , 560)) |
paste | im, (x, y) | 粘贴图片方法 | img.paste(crop_img, (0, 0)) |
resize | (width, height) | 调整图片大小 | resized_img = img.resize((width, height)) |
thumbnail | (width, height) | 制作缩略图,等比例缩放图片大小 | img.thumbnail((w//3, h//3)) |
rotate | angle | 围绕其中心逆时针旋转给定的度数。返回此图像的副本。 | rotate_img = img.rotate(30) |
show | 无 | 显示此图像。此方法主要用于调试目的。 | img.show() |
copy | 无 | 复制图像。返回一个新的Image对象。 | copy_img = img.copy() |
crop | (left, upper, right, lower) 矩形元组参数。返回一个新的Image对象。对原图没有影响。 | 裁剪图片。 | crop_img = img.crop((420, 150, 860 , 560)) |
transpose | method,通过FLIP_LEFT_RIGHT和FLIP_TOP_BOTTOM可以分别实现水平竖直镜像翻转 | 创建并返回此图像的转置副本。 | img.transpose(Image.FLIP_LEFT_RIGHT) |
filter | filter | 对此图像应用图像增强滤镜。返回一个新的Image对象。 | img.filter(ImageFilter.BLUR) |
convert | mode | 转换图像模式。返回一个新的Image对象。 | img.convert(‘L’) |
getpixel | xy | 返回给定位置的像素值。 | img.getpixel((0,0)) |
putpixel | xy, value | 修改给定位置的像素值。 | img.putpixel((0,0), value) |
point | lut, mode | 将查找表应用于图像。返回一个新的Image对象。 | img.point(lut) |
split | 无 | 将图像拆分为单独的波段。返回一个元组,其中包含单独的波段。 | r, g, b = img.split() |
merge | mode, bands | 将单独的波段合并为单个多波段图像。返回一个新的Image对象。 | img = Image.merge(‘RGB’, (r, g, b)) |
load | 无 | 分配存储并加载图像数据。返回一个像素访问对象。 | px = img.load() |
例题
[CTFShow愚人杯]easy_re
32位无壳,拖进IDA看看
1 | int __cdecl main(int argc, const char **argv, const char **envp) |
只看得出来是个300*300的一个数组
记住403AA0地址是从28A0到5A6E3
尝试用x32dbg看看
也就是说用两个300以内数字去加密一段话
可以得到后面一大串的数字,尝试直接枚举出这两个key
利用flag的base64值是’ZmxhZ’来判断
1 | from base64 import * |
运行结果
提示研究一下加密矩阵,尝试把d_3aa0中的元素输出来发现很像RGB值,尝试转化成图片。最后输出
flagctfshow{d244daeb-7182-4c98-bec6-0c99329ab71f}
exp
1 | from base64 import * |
其他
np.fromstring
和reshape
都是NumPy中常用的数组操作函数。
np.fromstring
np.fromstring
函数用于从字符串或字节序列中创建NumPy数组。它将输入字符串或字节序列解析为一组数字,并返回一个NumPy数组。该函数的参数包括:要解析的字符串或字节序列、用于解析数字的数据类型和用于分隔数字的分隔符。
例如,下面的代码使用np.fromstring
函数从一个字符串中创建一个NumPy数组:
1 | import numpy as np |
输出:
1 | [1 2 3 4 5] |
reshape
reshape
函数用于改变数组的形状。它将一个NumPy数组重新排列为一个具有不同行数和列数的新数组。该函数的参数包括:要重排的数组、一个包含新形状的元组或整数列表。
例如,下面的代码创建一个二维数组,然后使用reshape
函数将其重新排列为一个具有不同行数和列数的新数组:
1 | import numpy as np |
输出:
1 | [[1 2 3 4] |
reshape
函数可以用于改变数组的维度和形状,但必须保证原始数组中元素的总数与新数组中元素的总数相同。因此,如果重排数组的形状会改变元素的数量,将会引发错误。
参考
- [1] TEA系列加密解密
- [2] 维基百科TEA
- [3] CTFShow第三届愚人杯官方WP
- [4] [ctfshow 2023 愚人杯] crypto,rev,pwn_石氏是时试的博客