base64简单逆向分析(下)

栏目: 编程工具 · 发布时间: 5年前

内容简介:从算法的角度看首先对上个帖子编译出来的exe文件进行一个简单的逆向分析(传送门:

前言

上一篇文章,戳: base64算法初探即逆向分析 ,介绍了base64的实现原理并且写了个简单的 C语言 来实现它。结尾举了个不恰当的例子,说将编码的table颠倒一下位置再加密网页就不能解密了,感谢@junkboy老哥分享的:[解码工具]( https://gchq.github.io/CyberChef/ )

工具 功能非常丰富,涵盖了当前主流算法的加解密,还可以选择base64的编码table进行解密。今天呢对base64的魔改进行一个逆向分析。

从算法的角度看

这个角度包括有源码或有程序可逆向,应用场景的话比如动态加密资源,或是ctf?(我不确定我瞎说的大佬轻喷)用户输入一个字符串,然后加密判断是否和指定字符串加密得到的字符串相同。

首先对上个帖子编译出来的exe文件进行一个简单的逆向分析(传送门: base64算法初探即逆向分析 。将编译出的exe拖入到IDA中并查看字符串:

base64简单逆向分析(下)

可以很直接的看到编码的table为:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

然后查看main函数:

base64简单逆向分析(下)

逻辑非常清楚:先调用base64_encode进行加密,然后调用base64_decode进行解密。


查看加解密函数:

base64简单逆向分析(下)

这里逻辑和上篇帖子加密的逻辑一模一样,就不在重复。

x32dbg调试

使用x32dbg加载程序并在解密函数出下断点:

base64简单逆向分析(下)

F7跟进到函数:

base64简单逆向分析(下)

这里可以看到该函数传递进来的加密字符串是:R3V5,用于解密的编码table就是我们定义的table并且内存地址在404080,我们在下面的内存窗口中 ctrl + g 跳转到该地址:

base64简单逆向分析(下)

这里就是用于解密的编码table了。


选中该段内容,右键->二进制编辑->编辑:

base64简单逆向分析(下)

我们这里随便修改一下这个table的ASCII并保存:

base64简单逆向分析(下)

可以看到内存窗口中已经完成了修改:

base64简单逆向分析(下)

继续运行程序,得到输出结果:

base64简单逆向分析(下)

可以看到这里通过修改编码table已经影响了解密结果。


PS:做完这个操作之后发现好像没有什么用,只是说明一下base64加解密中我们可以操作编码table,然鹅实际中根本用不着。

根据对base64加密算法的浅析,我们已经知道base64算法中,我们可控制的地方为编码table,所以大多数的base64 (也有可能是本人比较菜,见识不多) 魔改都可以通过修改编码table使其等同于加密时的编码table来还原,魔改base64一般有两种情况。         

1. 直接定义新编码table

2. 动态生成新编码table

先来说说第一种,这种方法实现起来比较简单,只需要修改数组就可以。不过弊端是IDA字符串就可能直接暴露。


第二种实现起来稍微麻烦一点,破译难度也略高。接下来详细介绍第二种。

动态生成编码table

关于动态生成的话,我自己试验了两个比较简单的想法。

1. 将原始的编码table打乱并拆解为多个table,比如以六个字母为一组,将原始的编码table替换为十个小的table。

2. 使用代码对原始编码table进行处理,加密时使用新的编码table。

打乱并拆解原始table

将原始table拆分成六组并预定义六个变量

base64简单逆向分析(下)

然后改写加密算法,使其在索引不同的时候查找不同的table。


原始赋值代码为:

base64[j++] = base64char[(int)current];

改写后代码为:

if((int)current<=10)
{
base64[j++] = table1[(int)current];
}
else if((int)current<=20)
{
base64[j++] = table2[(int)current-10];
}
else if((int)current<=30)
{
base64[j++] = table3[(int)current-20];
}
else if((int)current<=40)
{
base64[j++] = table4[(int)current-30];
}
else if((int)current<=58)
{
base64[j++] = table5[(int)current-40];
}else{
base64[j++] = table6[(int)current-58];
}

删除解密算法和合并的编码table,运行程序如下:

base64简单逆向分析(下)

将该程序拖入到IDA中查看:

base64简单逆向分析(下)

这种情况下,我们可以通过阅读加密函数的源码,去找到对应的编码table,组合起来形成完整的编码table,最后去网上找一个base64的解码实现,然后替换原始table即可完成解密。

加密原始table

原始的编码table说白了就是一个长度为64,无重复字符的字符串,我们写一个加密函数对该字符串进行加密即可。


一个简单的变换:

首先将大写字母颠倒

然后将小写字母对应的转换为33到58的字符

将数字转为一部分小写

最后将两个特殊字符对应为大写字母

static int stringEncrypt(const uint8_t *data, char *enstr, int strlen)
{
int count=5;
for(int i=0;i<strlen;i++)
{
if(data[i]>=65 && data[i]<=90)
{
enstr[i] = 155-data[i];
}
if(data[i]>=97&&data[i]<=122)
{
enstr[i] = data[i]-64;
}
if(data[i]>=48&&data[i]<=57)
{
enstr[i] = data[i] + 50 ;
}
if(data[i]==43)
enstr[i] = 121;
if(data[i]==47)
enstr[i] = 120;

}
return 1;
}

打印输出一下:

base64简单逆向分析(下)

同样的,删除解密函数之后编译并拖入到IDA。


字符串表:

base64简单逆向分析(下)

调试器加载该程序,在解密函数处设置断点:

F8运行函数之后,也可以得到真实的table

base64简单逆向分析(下)

如果再狠点,可以不使用变量接收处理过后的新table,每个字符加密的时候变换一次。


新定义一个加密单个字符的函数:

static char charEncrypt(int data)
{
char *table = TABLE1;
data = table[data];
if(data>=65 && data<=90)
{
data = 155-data;
return (char)data;
}
if(data>=97&&data<=122)
{
data = data-64;
return (char)data;
}
if(data>=48&&data<=57)
{
data = data + 50 ;
return (char)data;
}
if(data==43)
{
data = 121;
return (char)data;
}
if(data==47)
data = 120;
return (char)data;
}

该函数的功能是:对table中的单个字符进行加密。


参数是编码table的索引,返回值是加密后的编码table。


所以加密算法中的赋值方式也会发生改变:


从:

base64[j++] = table1[(int)current];

直接变换为

base64[j++] = charEncrypt((int)current);

运行程序:

base64简单逆向分析(下)

这样做的话就无法在内存中直接查看到变换的编码table,这种时候想要还原加密的字符串,要么就一直断点调试,要么就逆向charEncrypt的算法,将编码table跑出来。

无算法的角度

这种情况可能比较少见 比如某个字符串通过API接口得到一个加密的字符串。现在知道了原字符串和加密字符串,对算法进行一个逆向。

原字符串

base64encodetest

加密后

B-U:AGBbADg*"dI,$TE:$Z==

这种情况,先求原字符串正常加密的base64

YmFzZTY0ZW5jb2RldGVzdA==

通过比较可以得知:原本的大写Y(89)变换为了大写B(66)
m变换为了-
F变换为了U
z变换为了:
......

我这里对编码table的加密比较简单,大佬们应该一看就知道规律了。所以很容易得到变换的规律推出加密算法并重写。


所以我这种思路的命门在于:变化table时候的强度。

又没有算法,又没有原始字符串。

这种情况怎么逆向?

PS:论述过程中可能也不严谨有些许错误,希望大家多多包涵,也欢迎大佬们给点意见,我继续学习。

base64简单逆向分析(下)

- End -

base64简单逆向分析(下)

看雪ID: 顾何       

https://bbs.pediy.com/user-757351.htm

本文由看雪论坛  顾何   原创

转载请注明来自看雪社区

热门图书推荐

base64简单逆向分析(下)   立即购买!

base64简单逆向分析(下)

公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com

点击下方“阅读原文”,查看更多干货!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

黑客与画家

黑客与画家

[美] Paul Graham / 阮一峰 / 人民邮电出版社 / 2013-10 / 69.00元

本书是硅谷创业之父Paul Graham 的文集,主要介绍黑客即优秀程序员的爱好和动机,讨论黑客成长、黑客对世界的贡献以及编程语言和黑客工作方法等所有对计算机时代感兴趣的人的一些话题。书中的内容不但有助于了解计算机编程的本质、互联网行业的规则,还会帮助读者了解我们这个时代,迫使读者独立思考。 本书适合所有程序员和互联网创业者,也适合一切对计算机行业感兴趣的读者。一起来看看 《黑客与画家》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试