在perl 5.10.0中反转rand,有谁知道在哪里可以找到rand / srand的源代码?

时间:2015-09-13 21:25:11

标签: perl random crypt srand

我正在进行一项任务,我有一个passwd文件,我将在其中找到所有密码。其中大多数都很容易与开膛手杰克和一些调整,但额外的功劳要求我找到由perl 5.10.0中的rand生成并用crypt加密的8字节字母数字密码。 我提出了三种方法来解决这个问题:

  1. 蛮力:62 ^ 8计算=我的机器上300周。我可以 租用服务器,我的机器功率是我的机器功率的300倍。 不知何故,这感觉就像浪费资源/电力一样 额外的功劳。
  2. Break Crypt :不确定这个,但我已经生成了一个 我发现的其他密码中的字符集,减少了增量 蛮力到5天,但我认为只有这样才有效 密码仅包含先前存在的字符(17 普通文本),也许如果我幸运的话! (非常不可能)

  3. Break rand :如果我能找到用于生成的相同种子 密码。然后,我可以生成字典以供给杰克。为了 从我提供的文件中获取种子然而我必须这样做 了解perl如何创造种子(如果甚至可能的话) 在5.10.0)。

  4. 根据我在早期Perl版本上的研究,只有System Time被用作种子。我创建了一个脚本,它使用m_time(Time From Epoch)给我的passwd文件(+ -10,以确保我确定文件在一秒内生成)作为生成的种子一个字典,这种格式,因为我不知道rand()我的密码的实际调用是什么:

      

    abcdefgh
    bcdefghi
    cdefhijk

    我把字典送给杰克。当然这没有用,因为在Perl 5.004之后Perl使用其他东西(我的问题的要点)来生成种子。

    所以,我的问题是,是否有人知道在哪里可以找到Perl用来生成种子的源代码,和/或rand / srand的源代码。我正在寻找看起来像这样的东西,但对于版本5.10.0:

    What are the weaknesses of Perl's srand() default seed, post version 5.004?

    我尝试在/lib/perl目录中使用grep,但我迷失在所有#define结构文件中。

    如果您认为我完全偏离了作业和/或有关此事的任何建议,也请随时告诉我。

1 个答案:

答案 0 :(得分:4)

你不想查看/ lib / perl,你想查看Perl源代码。

这是Perl_seed() in util.c as of v5.10.0,如果在没有参数的情况下调用srand,或者在没有首先调用rand的情况下调用srand,则调用该函数。

如您所见,在具有随机设备支持的Unix系统上,它使用来自/dev/urandom的字节来为RNG提供种子。在没有这种支持的系统上,它使用时间(如果可能,具有微秒分辨率),Perl进程的PID以及Perl解释器中各种数据结构的内存位置的组合。

urandom案例中,猜测种子实际上是不可能的。在第二种情况下,它仍然有可能类似于暴力破解密码;从微秒时间戳开始,你有20位的不可预测性,从PID开始有16位,如果你知道系统运行的详细信息,可能在0到20位之间,但是最多可达64位如果您根本不了解,则为96位。

我会说通过猜测种子来攻击Perl的rand可能不实用,并且从输出中反转它可能也不是,特别是如果它是在具有drand48的系统上运行的话。您是否考虑过基于GPU的暴力破解工具?