首页
社区
课程
招聘
[原创]一个有趣的加密小算法及其逆向
发表于: 2020-8-25 23:01 20796

[原创]一个有趣的加密小算法及其逆向

2020-8-25 23:01
20796

(不太确定发哪个板块,不过古典密码应该勉强也算得上《密码算法》吧~~)
前两天在强网杯的逆向safe_m2m中无意中发现了这么一段代码:

sub_402A40

关键代码是:

整理一下:

已知c,求p。且由于运算量过大(循环100016次),不可爆破。

乍一看无从下手,这怎么逆向啊?

观察了一会,发现可以进行变量代换。

x = p ^ (p << 5),有:

继续设y = x ^ (x >> 17),有:

综上,有如下的关系:

这样,算式变得简单多了。

但是,对于这种类型的等式,假设已知x(int),应该如何求p(int)呢?

其实很简单,如果这个变量不是一个int,而是一个数组,我感觉很容易想到解法,但是这样的 形式不太容易想。

答案是以bit为一个单位进行运算。

对于低5位bit:

由于p << 5的低5位bit均为0,所以 p ^ (p << 5)的低5位bit的值就是p低5位bit的值。可以写作p[i] = x[i]

对于x的高27位(32-5)bit:

x[i] = p[i] ^ p[i - 5],即p[i] = x[i] ^ p[i - 5]。x是已知的,同时由于上一步知道了p[0]~p[4]的值,所以p[i - 5]也是可以逐步求出的。

以上便是左移形式的算式的求解,右移形式的求解与之类似,不在赘述。

可能大佬们觉得很简单,但这是我第一次接触这种以bit为基本单位进行依次求解的算式,会有种比较新奇的感觉。

顺便今天七夕闲得没事干,于是写了点相关的加解密代码。

前面的示例中嵌套了3次,实际上可以嵌套无数次(效率另说),以增强逆向的难度。

我感觉嵌套了3次的还勉强能看出可以进行变量代换,但是如果嵌套了七八次,甚至更多次数,就很难进行分析了。下面的代码是嵌套了8次的:

上面的这个代码扔进ida里,如果没有事先了解这个形式的算式,要是很容易逆出来,那您绝对是大佬~

当然我知道古典密码加解密毫无安全性可言,同时这个算法的效率也不高(也或许是我的代码优化得不够到位??),根本毫无用武之地。不过,当个简单一点的CTF题或许不错?

菜鸟七夕闲得慌,就随手一写,希望大佬们可以轻喷~~

下面是代码,共三个文件。前两个是算法,最后一个是函数生成器,如果你希望加大难度,可以使用第三个脚本生成相应的encrypt1()和decrypt(),不过嵌套次数也别太大了,我测试过嵌套次数为15的,可以正常运行,比这个数字更大的没测试,不过问题应该不大,顶多效率很差就是了。

首先是核心算法,对一个unsigned int加密后解密。

然后是对文件进行加解密的代码:

最后是一个生成加解密函数的python脚本,可以控制嵌套次数:


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-8-26 11:35 被iyzyi编辑 ,原因:
收藏
免费 3
支持
分享
最新回复 (3)
雪    币: 397
活跃值: (799)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wsy
2
给了算法的古典密码算法,严格来说,不算密码
古典密码算法的安全性是只给你密文,数量可以比较多,求解明文和算法
整篇文章还不错,败笔就是“古典密码加解密毫无安全性可言”这句话
古典密码现在不用的核心原因不是不安全,而是不好用,算法保密太难做到
2020-8-26 08:09
0
雪    币: 3190
活跃值: (1816)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
"顺便今天七夕闲得没事干,于是写了点相关的加解密代码" 这一句话 透露着未来大佬的魔力
2020-8-26 10:13
0
雪    币: 10845
活跃值: (1054)
能力值: (RANK:190 )
在线值:
发帖
回帖
粉丝
4
虽然算法不复杂,但分析的过程还挺生动
2020-12-23 11:56
0
游客
登录 | 注册 方可回帖
返回
//