【问题标题】:Reversing rand in perl 5.10.0, anyone know where to find the source code for rand/srand?在 perl 5.10.0 中反转 rand,有人知道在哪里可以找到 rand/srand 的源代码吗?
【发布时间】:2015-12-09 20:36:28
【问题描述】:

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

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

  3. Break rand:如果我能找到用于生成 密码。然后我可以生成字典来提供给 Jack。为了 从给我的文件中获取种子但是我必须 了解 perl 是如何创建种子的(如果有可能的话 5.10.0)。

根据我对早期 Perl 版本的研究,只有系统时间被用作种子。我制作了一个脚本,在给我的 passwd 文件上使用m_time(从纪元开始的时间)(+-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 结构文件中。

如果您认为我对任务和/或有关此事的任何建议完全偏离轨道,请随时告诉我。

【问题讨论】:

    标签: perl random crypt srand


    【解决方案1】:

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

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

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

    urandom 的情况下,猜测种子实际上是不可能的。在第二种情况下,它仍然很困难,可能类似于暴力破解密码;微秒时间戳中有 20 位的不可预测性,PID 中最多 16 位,以及内存地址中的未知数量,如果您知道运行它的系统的详细信息,可能在 0 到 20 位之间,但最多 64或者 96 位,如果你完全没有知识的话。

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

    【讨论】:

    • 但如果密码是在 Windows 上生成的,在哪里(直到最近的 perls)你只有 15 位随机值(并且没有额外的种子,afaik),那就是另一回事了
    • 感谢您的快速回复。在我标记为已回答之前,我将在接下来的几天里使用这些信息。我还没有尝试过基于 GPU 的,所以我会研究一下。由于以前这样做的人的提示,我专注于 srand/rand 方面,但在我看来,除非他使用“使用 5.004;”那么就没有足够的(简单的)方法来打破兰特。
    • 在花了一周的时间之后,我终于明白了 perl rand 的工作原理。
      1) 在 perl 的第一个 rand 它将调用 srand(),它使用一个整数值作为种子(2^32) 种可能性,但 REAL 种子有 2 个未使用的尾随字节。 2) 每个 rand 将实际使用 UNIX drand48() 并按照文档更改种子。
    • 我很抱歉未能发布回复,在回复中难以格式化。这个链接解释了 Unix 系统上的 drand48:man7.org/linux/man-pages/man3/drand48.3.html 真正的种子总是有 6 个字节。非常感谢 hobbs 让我朝着正确的方向前进。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    相关资源
    最近更新 更多