QGB-Re-Encrypt


强国杯-REVER-Encrypt

0x0 前言

哈夫曼压缩法

https://www.cnblogs.com/daoluanxiaozi/archive/2011/12/26/2302464.html

大家先通过这个网址了解哈弗曼 以助于了解后面的代码

知道什么是哈弗曼算法后分为4个步骤

1.统计:读入源文件,统计字符出现的次数(即统计权重),顺便根据权重进行从大到小的排序(主要的话之后的操作会简单一些)

2.建树:以字符的权重(权重为0的字符除外)为依据建立哈夫曼树

3.编码:依据2中的哈夫曼树,得到每一个字符的编码

4.写入:新建压缩文件,写入压缩数据。

其中我分析的代码来自于Retard师傅。

https://blog.csdn.net/REtard_/article/details/125841203?spm=1001.2014.3001.5502

0x1 统计 初始化并且统计权重频率

1

第一步算法就是初始化内存空间,然后存储计算好的每一个字节的频率

然后输出到第5位,因为前4位是flag嘛

5

可以看见输出的是D5,意思即为有213个字节使用到了

0x2建树 找出高频字节输出

2

寻找到最高次数的字节,然后按照大小输出,再当作索引于s_box交换

0x3 编码

3

就是哈夫曼中的编码算法,依次取出最高频率次数字节进行编码,并且输出

4

这里一一对应着哈夫曼压缩法中的补齐思路

11

0x4 整理思路

1.把需要解密回去的十六进制转换成bit 因为哈夫曼是bit进行压缩的

2.先把被s_box替换的每个频率字节替换回来

3.既然哈夫曼是通过00 01 10 这样来代表每一个字节的,那我们可以直接通过抄ida中伪代码的哈夫曼算法把每一个00 01 10 对应的编码库算出来,然后再取bit进行一个一个对比,就可以替换回去了。

0x5 解密

7

先是把hexData转换回bit

6

然后再把213个频率字节替换回去

大家看了Retard师傅的代码对于table怎么来可能有疑惑

12

分析建树时,我们可以知道频率字节是按照大小高低输出的,所以我们直接通过dump其中的213位就ok了

14

test2是哈弗曼压缩法,这里就是计算每一个字节对应的编码

13

这里的buffer就是hexData转换的bit,然后和probuild我们的编码表一一对比,如果成功就会打印出来。

0x6 总结

好了,这就是整个分析过程

在这里先感谢Retard师傅在csdn分享了这篇wp,不然估计是很难复现出来,我只是站在巨人的肩膀上分析学习了一波。

无论是obf还是encrypt都学习到了很多,感觉打开了更多的分析思路。

师傅们如果想要题目ida的注释文件可以私聊我拿,博客中有qq

希望自己也有一天可以成为一个厉害的RE手,冲啊!!!


文章作者: Blue
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Blue !
评论
  目录