月赛-Crackhash

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了月赛-Crackhash相关的知识,希望对你有一定的参考价值。

Crackhash

这个题目是我为月赛出的,完全仿照自mma 1st simple_hash。

这道题目比较有意思的地方在于在32位的程序中模拟了64位的算术运算。

题目的思路很清晰。要求输入全为数字,然后对输入的数字求hash值并判断是否正确。如下图:

技术分享

所以关键的部分就在于cacl_hash这个函数,进入其中。

技术分享

逻辑也很简单,因此进入sub_80487EC中,会看到如下:

技术分享

里面是个递归程序,并且有些复杂,并不容易较快分析清楚。不过没关系,这并不耽搁我们做题。

上GDB,我们按照cacl_hash函数的运算,手动调用几次sub_80487EC函数,观察一下它做了什么。在GDB里,测试p 0x80487EC(0LL, 577LL)会发现结果为0,测试p 0x80487EC(1LL, 577LL)会发现结果为577,测试p 0x80487EC(2LL, 577LL)会发现结果为1154。继续测下去会突然恍然大悟,原来sub_80487EC就在32位程序里模拟了64位的乘法运算。

其实也可以将Ida产生的伪代码编译,是真的可以编译执行的,在Ida的安装目录里,plugins目录下有一个defs.h头文件,在编译时包含此头文件就可以了。

这样,就不用去在一步一步地分析sub_80487EC做了什么了。这个时候再去看cacl_hash,就会发现这是一个多项式hash算法,特殊就在于是64位的运算。

最后,就是一个暴力破解hash值的过程。我写了一个比较笨的程序,也是可以几分钟就爆破出来结果的。当然写得好的,几秒也是可能的。

技术分享

以上是关于月赛-Crackhash的主要内容,如果未能解决你的问题,请参考以下文章

月赛-Crackhash

小白月赛-9

牛客小白月赛#69(A-E)

牛客月赛43

bzoj 5091: [Lydsy0711月赛]摘苹果

牛客白月赛8题解