上一章中我们带领大家了解了加密算法——RC4,TEA,Base64算法的原理,但是加密算法远不止这些,需要大家自行去学习,在这一章中,我来带领大家了解密码算法特征识别,变种密码算法分析。
一.密码算法特征识别
1.什么是特征常量
在我们逆向过程中,经常遇到一些开源的代码,如果我们能找到这些开源的代码,可以减少很多工作量。
例如:AES算法对于初学者来说非常复杂,如果初学者未曾学习过AES代码,那么它将很难看懂IDA生成的AES伪代码。如果这道这段代码是AES后,就可以使用AES开源的代码或者其他的材料作为逆向参考,降低逆向的难度。
-
如何找到某段代码中的开源代码?
一般来说,我们会使用特征常量作为关键字搜索。特征常量是算法中用到的特征整数或字符串数组。 -
常见特征常量:
- 整数特征
- 字符串特征
- 字节数据特征
我们在使用IDA的时候,也可以安装FindCrypt插件来自动分析算法常量。
-
除了加密算法以外,还有其他代码的特征常量一可以用于源码查找:
- 例如:sqlite3库有大量的字符串常量,用这些字符串常量可以确定:
-
- 程序使用了sqlite3库
-
- 确定部分关键sqlite3的函数名
-
- 例如:sqlite3库有大量的字符串常量,用这些字符串常量可以确定:
二. 变种密码算法分析
1. 变种 RC4
我们先来看看上一篇文章中讲解到的RC4加密算法魔改方法:
- 由于RC4的加密就是生成密钥流和输入进行异或,所以通常魔改就是添加一些可逆预算。
-
- 魔改初始化算法,可以将S盒初始化值不设置为0-255,可以设置为其他的,也可以在s的初始置换过程添加可逆计算。
-
- 由于最后加密flag是利用密钥流来进行单字节加密的,所以也有人在这个地方加一些可你运算来进行魔改。
2. 变种TEA
常见的魔改方法:
-
- 将dalta的值进行修改,不咋是默认的0x9e3779b9
-
- 在每轮的迭代加密中添加可逆运算
-
- 在迭代完之后,再赋值回去的时候,添加可逆运算
- 实际上还有一些加密模式的TEA:
CBC模式的TEA:CBC模式(Ciphre Block Chaining):其实主要就是将明文分组与前一个密文分组进行异或运算,然后再进行加密,对于第一组的话就iu是设置一个初始值来和第一组明文进行异或。
比如:CBC模式循环加密64字节,每次循环加密8个字节:
每一轮是get_data取我们的v0hev1,data1和data2和v0或v1异或,异或之后的data1和data2传入指针进行TEA加密,之后再将加密后的赋值回我们的v0和v1。 - 我们理解了CBC模式的TEA之后,我们该如何逆向它呢?首先我们是有每一轮加密后的v0和v1的,就是加密数据,TEA我们也是能够逆向的,那么就剩下逆向每一轮的data1=0和data2=v1了,而后面的轮数的data1和data2是会被我们的加密结果更新的,我们只有第一轮的data1和data2,那么我们就从这个地方下手,先解密第一轮得到第一轮的v0和v1明文,再重新去加密更新data1和data2用于下一轮的加密。
三. 变种AES
1. AES常见的魔改:
-
- 字节代换的时候使用逆S盒进行代换
-
- 对行位移进行魔改,状态矩阵的第0行左移0字节,第一行左移1字节,第二行左移2字节,第三行左移3字节,每一行的元素左移的字节数是可以更改的。
-
- 对列混合进行魔改,虽然可以,但是一般不会有人这样做,状态矩阵与固定的矩阵相乘后得到混淆后的状态矩阵,如果这个固定矩阵被更改,那么求你想的时候要重新计算另外一个矩阵。
-
- 对中间轮数的加密顺序进行更改。
这篇文章的分享就到这里,对于逆向过程中的算法,还是需要大家多多实战练习。