强国杯-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 统计 初始化并且统计权重频率
第一步算法就是初始化内存空间,然后存储计算好的每一个字节的频率
然后输出到第5位,因为前4位是flag嘛
可以看见输出的是D5,意思即为有213个字节使用到了
0x2建树 找出高频字节输出
寻找到最高次数的字节,然后按照大小输出,再当作索引于s_box交换
0x3 编码
就是哈夫曼中的编码算法,依次取出最高频率次数字节进行编码,并且输出
这里一一对应着哈夫曼压缩法中的补齐思路
0x4 整理思路
1.把需要解密回去的十六进制转换成bit 因为哈夫曼是bit进行压缩的
2.先把被s_box替换的每个频率字节替换回来
3.既然哈夫曼是通过00 01 10 这样来代表每一个字节的,那我们可以直接通过抄ida中伪代码的哈夫曼算法把每一个00 01 10 对应的编码库算出来,然后再取bit进行一个一个对比,就可以替换回去了。
0x5 解密
先是把hexData转换回bit
然后再把213个频率字节替换回去
大家看了Retard师傅的代码对于table怎么来可能有疑惑
分析建树时,我们可以知道频率字节是按照大小高低输出的,所以我们直接通过dump其中的213位就ok了
test2是哈弗曼压缩法,这里就是计算每一个字节对应的编码
这里的buffer就是hexData转换的bit,然后和probuild我们的编码表一一对比,如果成功就会打印出来。
0x6 总结
好了,这就是整个分析过程
在这里先感谢Retard师傅在csdn分享了这篇wp,不然估计是很难复现出来,我只是站在巨人的肩膀上分析学习了一波。
无论是obf还是encrypt都学习到了很多,感觉打开了更多的分析思路。
师傅们如果想要题目ida的注释文件可以私聊我拿,博客中有qq
希望自己也有一天可以成为一个厉害的RE手,冲啊!!!