首页
社区
课程
招聘
[原创]了解常用加解密算法并简单逆向识别
发表于: 2019-11-22 01:00 12139

[原创]了解常用加解密算法并简单逆向识别

2019-11-22 01:00
12139

想作为分析勒索病毒前的密码学接触.有些太难的算法,弟弟属实吃力,就不献丑了.可能也存在未察觉的错误,希望各位帮忙提出来,避免误导他人.谢谢师傅们.

常用加解密算法的逆向分析中的识别,不做过多算法原理上的叙述,别人讲的好多了.站在巨人的肩膀上.

这篇文章只作为特征查找用来辅助平时分析用.

两种工具ida插件FindCrypt2peidKANA进行算法识别是很好用的.

base64最早就是用来邮件传输协议中的,原因是邮件传输协议只支持 ascii 字符传递,因此如果要传输二进制文件,如:图片、视频是无法实现的。因此 base64就可以用来将二进制文件内容编码为只包含 ascii 字符的内容,这样就可以传输了.

简单来说为了兼容各种数据格式.

采用每三字节置换为四字节的方式,3x824位二进制转换为4x6的方式,前两位用0填充.字符不够转换的话,空字符=填充.(1字节或二字节输入,那么只能使用输出的2个或3个字符)

使用字符表"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"置换

Base24:"BCDFGHJKMPQmogRTVWXY2346789"

Base32:"ABCDEFGHJKLMNOPQRSTUVWXYZ234567"

Base60:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx"

Findcrypt2KANAL都能是识别出置换表.

所以先关注置换表,然后关注下相关的位运算操作,可能就是base相关算法.

编码伪代码部分:image.png

嘛 具体问题具体分析

用的比较多的就是MD5SHA-1等算法

这里和加密与解密上都讲的挺好的,我做些我需要的东西的提炼

img

填充消息使其长度与448 mod 512同余,是为了后面填充64位的长度.

填充方法:附一个1在消息后面,然后用0填充,填充长度0<x<=512

初始化最开始需要使用0x67452301,0xefcdab89,0x98badcfe,0x10325476进行初始化

然后进行数据处理,相关细节看书和源码就好.需要使用左移数组{ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7,12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10,15, 21, 6, 10, 15, 21, 6, 10, 15, 21,, 6, 10, 15, 21 }

64个存放32位字节的加法常数数组,由2^32 * (abs(sin(i)))得出,i的范围164.

{ 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 };

512位消息分组为16组 x 32位,进行4*16次运算

128位散列值。

FindCrypt2peidKANA都是识别加法常数

采用加密与解密中的MD5KeyGen.exe进行分析学习

image.png寄存器初始化

MD5计算部分伪代码image.png

每使用16个硬编码常量,都会发现算法的改变.详细算法看上面第四点

这样简单的确定了是MD5算法,然后可以从image.png进行回溯,ida识别有点问题,汇编看了下二者相等.

image.png

v11是置换表说明v4可能就是计算后的值,再动态调试可知,过滤掉前面的判断进行MD5计算的值为image.png

说明在中途加了www.pediy.com字符串,

image.png

sub_4012E0集成了字符串添加拷贝的字符大小刚好等于原字符串差64位的大小时,拷贝并直接计算MD5的功能.

image.png

大概的流程差不多分析出来了,基本上修改下原版MD5的算法就能写出注册机了

image.png

散列值长度:SHA-1 160位 SHA-256256位 SHA-384 384位 SHA-512512位

SHA-2包括SHA-224SHA-256SHA-384SHA-512SHA-512/224SHA-512/256

原理参考:https://www.wosign.com/News/news_2018121101.htm 讲的很详细

消息填充和MD5一样,512位为一组,然后16组x32位,然后扩充位80组x32位,进行4*20次运算

使用该函数进行计算A,B,C,D,E←[(A<<5)+ ft(B,C,D)+E+Wt+Kt],A,(B<<30),C,D,f函数伪代码在下方

使用常数

初始化寄存器的hash

使用加密与解密的6.1.2示例程序

FindCrypt插件识别出SHA-1常量

image.png

对输入进行判断,Name不为空,Serial为20位

image.png

基本流程image.png

注册机

成功image.png

计算函数的部分伪代码参考image.png

要注意字节与位转换函数,不太熟悉容易迷惑

RC4生成一种被称为密钥流的伪随机流.它与加密的数据长度相等.密钥流与数据同位异或进行加解密.密钥流生成分为两个部分KSA与PRGA.

the key-scheduling Algorithm (KSA) 密钥调度算法

按照升序0,1,2,3,4.....,254,255初始化一个256字节数组S.

使用密钥填充一个256字节数组T ,长度不够的话,轮转填入,直到填满.

对数组S进行打乱.

the Pseudo-Random Generation Algorithm (PRGA) 伪随机生成算法

函数完整代码

使用加密与解密中的RC4Sample进行分析学习.

image.png中间两个函数可能就是KSAPGRA.

伪代码全图:image.png

可以看中间do-while循环,有一个数组的256位初始化.说明a1+2是一个数组s-box的位置,那么*a1a1[0]就是两个int型变量.然后下面的循环中,其实是交换和计算j是交叉在一起的.31,32,35,36是计算j的位置,30,33,34是交换.

通过v3a3比较,获得对key长度取余的效果.v8则是每循环一次加一取值的s-box.

image.png

第一眼会发现做了异或操作,可能这就是PRGA.

仔细观察后发现result[2]其实是s-box的首地址,其他变量的话就是相对首地址的偏移.30,31,34,35,36其实交换函数.其他就是获得异或key所需的偏移计算.

对于循环,又有256或者0x100的关键字,获取字符串长度,又再次使用处理过的值进行异或的话可以去怀疑是RC4加密.

xtea,xxtea,tea都可以用0x9E3779B9识别,详细分析后面有空再写吧

分组长度:128比特

密钥长度:128, 192, 256比特

圈数:分别为10, 12, 14

设定Nr为第r+1次轮函数. 将输入复制到状态数组中.在进行一个初始轮密钥加操作之后, 执行Nr次论函数.对状态数组进行变换, 其中最后一轮不同于前Nr-1 轮. 将最终的状态数组复制到输出数组中. 即得到最终密文(引用自加密与解密)

AES-128:

Screenshot_20191122_193156.jpg

轮密钥加(AddRoundKey):将状态元素与轮密钥进行简单的异或计算,唯一需要三个参数的过程.

字节替代(SubBytes):使用S-box进行查表,字节替换操作。

S-box:

image.png

行位移(ShiftRows):数组大小为4x4字节,第一行保持不变,第二行循环左移1字节,第三行循环左移2字节,第四行循环左移3字节.

列混淆(MixColumns):以列为单位,可看作进行矩阵乘法,矩阵为((02,03,01,01)(01,02,03,01)(01,01,02,03)(03,01,01,02))

密钥扩展(KeyExpansion):通过密码扩展算法生成Nr+1个32位双字

解密就是逆过程了

大多数时候,常见aes使用空间换时间

将轮函数的几个步骤合并为一组简单的查表操作,只是最后一步没有,需要使用常规方法处理.

然后需要4个T表,一个T表需要256个4字节的32位双字,所以需要4kb的存储空间.

每进行一轮,4次查表,4轮异或运算.一共有四次,16轮查表,16轮异或

T表数据图

img

一样使用的是加密与解密中的样例

FindCrypt识别处MD5AESimage.png

Serial长度为32字节,使用16进制的话刚好为128位。image.png

静态分析大概这样,接下来动态看看image.png

sub_401320压入初始化后的寄存器数组地址,name, 长度image.png

最终获得128位MD5散列值image.png

执行sub_401EC0

内存中的sbox

image.png

细致算法省略

image.png函数中存在大量的移位异或操作,太大了就不截图了.

注册机

ECB 与 CBC

PKCS7Padding: 假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小。

PKCS5Padding:PKCS7Padding的子集,块大小固定为8字节

Zero-Padding 用0填充(适合以\ 0结尾的字符串加解密)

选择两个不同大的质数pq,计算n=p*q

根据欧拉函数,求得r=φ(n)=φ(p)φ(q)=(p−1)(q−1)

选择一个与e互质且小于r的整数,并求得c关于r的模反元素,命名为d,有ed ≡ 1 mod r

销毁pq,此时(n,e)为公钥,(n,d)为私钥

$$
加密
加密 n^e ≡ c \bmod N,消息解密c^d ≡ n \bmod N \
(只需要证明n^{ed} ≡n\bmod N即可)
$$

发现这个程序和书前文使用Miracl库运算的逻辑相同,那也简单分析一下.

image.png

image.png

逐一检测数据是否为0123456789abcdeABCDEF中的数据,如果有则直接报错

image.png

参数初始化

image.png

传入Serial赋值m,大数ne

image.png

计算取模

image.png

比较判断是否正确

由此我们可知是将serial进行RSA解密与输入进行比较.得知了n=0x80C07AFC9D25404D6555B9ACF3567CF1e=0x10001

使用大数分解RSAToolFactor N功能,得到p=0xA554665CC62120D3,q=0xC75CB54BEDFA30AB

输入E,点击Calc. D得到d=0x651A40B9739117EF505DBC33EB8F442D

xwdidi的16进制为787764696469,使用大叔计算器进行c ^d ≡ m mod N计算,最后得到m=0x5D99FFF7B67285275C8639BCEF982B7 ,带入软件后返回Success!

注册机

powmod函数的部分伪代码作为参考image.png

Mircal库过于常用,需要进一步的熟悉才能更加利于分析.

头文件有mircal.hmirdef.h两者,库文件为ms32.lib

以下是大数运算库函数的Magic number

反汇编识别着重在于查看函数内部的mov doword ptr [eax+ecx*4+20], yy格式的反汇编代码,yy即为magic number

image.png

这是函数对比图

image.png

image.png

其他的就不一一找了,都在函数内部都能看见.基本上是这样去识别.

<<加密与解密4>>

https://www.cnblogs.com/gambler/p/9075415.html

http://dyf.ink/reverse/Identify-Encode-Encryption/introduction/

https://xz.aliyun.com/t/5644

https://www.zhihu.com/question/36306744

https://bbs.pediy.com/thread-251248.htm


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-11-22 18:34 被阿伪编辑 ,原因:
收藏
免费 12
支持
分享
最新回复 (9)
雪    币: 47147
活跃值: (20410)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
感谢分享!
还有一张图片丢失,你可以直接截图,粘贴到论坛编辑中来。


2019-11-22 09:57
1
雪    币: 1397
活跃值: (268)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
kanxue 感谢分享!还有一张图片丢失,你可以直接截图,粘贴到论坛编辑中来。
已修复
2019-11-22 10:23
0
雪    币: 8427
活跃值: (5021)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
4
学习了 mark
2019-11-22 13:05
0
雪    币: 1522
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
2019-11-22 14:21
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
很全面,碰到个解密的问题,搞不定,能帮忙给解密一下不~
2019-11-26 10:05
0
雪    币: 26588
活跃值: (63252)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
7
感谢分享~
2019-12-2 15:47
0
雪    币: 2322
活跃值: (3029)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
IDA直接用findcrypt插件
2019-12-2 17:51
0
雪    币: 1129
活跃值: (2731)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
感谢分享
2019-12-8 20:20
0
雪    币: 140
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习
2020-2-9 15:58
0
游客
登录 | 注册 方可回帖
返回
//