• 月赛-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值的过程。我写了一个比较笨的程序,也是可以几分钟就爆破出来结果的。当然写得好的,几秒也是可能的。

  • 相关阅读:
    C#学习笔记-类的一些基本成员
    SpringBoot 好“吃”的启动原理
    线程与进程
    powerdesiner
    maven
    Java反射
    获取类的全部信息 本地方法
    今天在看慕课网的java学习路径
    操作系统之哲学原理
    今天在看慕课网的java学习路径
  • 原文地址:https://www.cnblogs.com/wangaohui/p/5184738.html
Copyright © 2020-2023  润新知