首先对上个帖子编译出来的exe文件进行一个简单的逆向分析(传送门:https://bbs.pediy.com/thread-251117.htm)。将编译出的exe拖入到IDA中并查看字符串:
可以很直接的看到编码的table为
然后查看main函数:
逻辑非常清楚:先调用base64_encode进行加密,然后调用base64_decode进行解密。
查看加解密函数:
这里逻辑和上篇帖子加密的逻辑一模一样,就不在重复。
使用x32dbg加载程序并在解密函数出下断点:
F7跟进到函数:
这里可以看到该函数传递进来的加密字符串是:R3V5,用于解密的编码table就是我们定义的table并且内存地址在404080,我们在下面的内存窗口中ctrl + g跳转到该地址:
这里就是用于解密的编码table了。
选中该段内容,右键->二进制编辑->编辑:
我们这里随便修改一下这个table的ASCII并保存:
可以看到内存窗口中已经完成了修改:
继续运行程序,得到输出结果:
可以看到这里通过修改编码table已经影响了解密结果。
ps:做完这个操作之后发现好像没有什么用,只是说明一下base64加解密中我们可以操作编码table,然鹅实际中根本用不着。
根据对base64加密算法的浅析,我们已经知道base64算法中,我们可控制的地方为编码table,所以大多数(也有可能是本人比较菜,见识不多)的base64魔改都可以通过修改编码table使其等同于加密时的编码table来还原,魔改base64一般有两种情况。
先来说说第一种,这种方法实现起来比较简单,只需要修改数组就可以。不过弊端是IDA字符串就可能直接暴露。
第二种实现起来稍微麻烦一点,破译难度也略高。接下来详细介绍第二种。
关于动态生成的话,我自己试验了两个比较简单的想法。
将原始table拆分成六组并预定义六个变量
然后改写加密算法,使其在索引不同的时候查找不同的table。
原始赋值代码为:
改写后代码为:
删除解密算法和合并的编码table,运行程序如下:
将该程序拖入到IDA中查看:
这种情况下,我们可以通过阅读加密函数的源码,去找到对应的编码table,组合起来形成完整的编码table,最后去网上找一个base64的解码实现,然后替换原始table即可完成解密。
原始的编码table说白了就是一个长度为64,无重复字符的字符串,我们写一个加密函数对该字符串进行加密即可。
一个简单的变换:
首先将大写字母颠倒
然后将小写字母对应的转换为33到58的字符
将数字转为一部分小写
最后将两个特殊字符对应为大写字母
打印输出一下:
同样的,删除解密函数之后编译并拖入到IDA
字符串表:
调试器加载该程序,在解密函数处设置断点:
F8运行函数之后,也可以得到真实的table
如果再狠点,可以不使用变量接收处理过后的新table,每个字符加密的时候变换一次。
新定义一个加密单个字符的函数:
该函数的功能是:对table中的单个字符进行加密。
参数是编码table的索引,返回值是加密后的编码table。
所以加密算法中的赋值方式也会发生改变:
从
直接变换为
运行程序:
这样做的话就无法在内存中直接查看到变换的编码table,这种时候想要还原加密的字符串,要么就一直断点调试,要么就逆向charEncrypt的算法,将编码table跑出来。
原字符串
加密后
这种情况,先求原字符串正常加密的base64
通过比较可以得知:原本的大写Y(89)变换为了大写B(66)
m变换为了-
F变换为了U
z变换为了:
......
我这里对编码table的加密比较简单,大佬们应该一看就知道规律了。所以很容易得到变换的规律推出加密算法并重写。
所以我这种思路的命门在于:变化table时候的强度。
睡觉。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-5-8 18:20
被jux1a编辑
,原因: