首页
社区
课程
招聘
[原创]第三题 七十二疑冢
发表于: 2018-12-6 23:38 4758

[原创]第三题 七十二疑冢

2018-12-6 23:38
4758

题目逻辑比较清晰,不需要太多逆向工作,main函数逻辑如下:

逻辑很清晰,拿到9字节的输入后,根据对应的72bit生成key,然后加密已知明文,要求所得密文是“序列号输入正确”。同时可以看到,key虽然长度是138,但在生成的过程中最多只改变前87个字节。

加密函数流程也很简单,

138轮的操作,实际上后面138-87=51轮是固定的。

可以用python模拟一下这key生成和加密两步操作,

其中dec可以把后面51轮固定操作倒推掉。

要求输出中文,也就是,

这里有两张表,d1和d2,d1用来生成key,d2用于加密过程。观察d2,其中几列明显有规律,第10、11两列看起来不规律。

图片描述

整体流程中只有异或操作,不妨看看d2[:,10]是否在GF(2)上线性。

果然是线性的,11列同理。

所以整个流程都是线性的,严格来说明文到密文是线性的,但题目中明文是固定的,这里可以试试看key到密文是不是线性的。只修改key中的固定位置pos的一个bit,看结果中的bit如何变化,如果这种变化跟pos之外的位置上是0是1无关,那么我们就可以得到key和密文的线性关系。

可以看到,虽然前面71个bit不同,但最后一位的bit变化带来的结果变化是一致的。

所以现在的加密过程等效于方程AX+B=Y。其中X是key,B是key全为0时的Y,A就是关系阵,dec(ans)可以拿到题目要求的Y,之后解线性方程就可以拿到我们要的X。

先拿Y和B,

再遍历key的每一个bit,拿到A,

注意这里搞错了矩阵列数,实际上只需要72列,这里弄了成了128*128的,当然其实是无所谓的,多余的都是0。

现在就可以算答案了,

故答案为E7DFE373BFF25B92B6。

图片描述


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

收藏
免费 5
支持
分享
最新回复 (1)
雪    币: 264
活跃值: (30)
能力值: ( LV5,RANK:78 )
在线值:
发帖
回帖
粉丝
2
分析过程很详细,学习了
2018-12-7 18:05
0
游客
登录 | 注册 方可回帖
返回
//