2015-09-13 59 views
1

我正在做一個任務,我有一個passwd文件,我將在其中找到所有密碼。他們中的大多數人很容易與傑克鬆土和一些調整,但額外的信貸要求我找到一個由rand生成的perl 5.10.0的8字節字母數字密碼,並用crypt加密。 我想出了三種方式來處理這個:在perl 5.10.0中反向rand,任何人都知道在哪裏可以找到rand/srand的源代碼?

  1. 蠻力:62^8 =計算中300周我的機器上。我可以 在一週內租用一臺服務器,使用我的機器功率300倍。 不知何故,這感覺就像一個 額外的信貸浪費資源/電力。
  2. 歇地穴:不知道就這一個,我卻產生了 的字符集,從我發現對方的密碼,降低了增量 蠻力〜5天,但我認爲,只有當這方面的工作 密碼只包含前面的字符(17 純文本),所以也許如果我運氣好的話! (可能性很小)

  3. 歇蘭特:如果我能找到用於生成 密碼相同的種子。然後,我可以生成字典給傑克。爲了讓 得到給我的文件的種子,但我必須 瞭解Perl是如何創建種子(如果它甚至可能在5.10.0 )。

從我在早期的Perl版本中研究過的只有系統時間被用作種子。我製作了一個腳本,該腳本在給予我的密碼文件(+ -10以確保雖然我確信該文件已在一秒內生成)上使用m_time(Time From Epoch)作爲種子來生成字典,並以此格式,因爲我不知道在我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結構的文件丟失。

如果您認爲我完全偏離了任務和/或有關此事的任何建議,請隨時告訴我。

回答

4

你不想看看/ lib/perl,你想看看Perl的源代碼。

這裏是Perl_seed() in util.c as of v5.10.0,這是被稱爲如果srand被稱爲不帶參數,或者如果rand被不帶srand首先被調用的函數。如您所見,在支持隨機設備的Unix系統上,它使用來自/dev/urandom的字節來播種RNG。在沒有這種支持的系統上,它使用Perl解釋器中的時間(如果可能的話,微秒的解析度),Perl進程的PID和各種數據結構的內存位置的組合。

urandom的情況下,猜測種子是不可能的。在第二種情況下,它仍然有點類似於強制密碼。您可以從微秒時間戳中獲得20位不可預測性,從PID獲得高達16位,並且從存儲器地址獲得未知量,如果您知道系統運行的詳細信息,則可能在0到20位之間,但最多可達64或96位,如果你根本沒有任何知識。

我想說的是,通過猜測種子可能不太實際,並且從輸出中反轉它可能不會,尤其是如果它在具有drand48的系統上運行的話,那麼攻擊Perl的rand。你有沒有考慮過基於GPU的暴力破解工具?

+0

但是如果密碼是在windows上生成的,那麼(在更新的perls之前)你只有15位的隨機值(並且沒有額外的種子,afaik),這是另一個故事 – ysth

+0

感謝您的快速響應。在我標記爲已回答之前,我將使用未來幾天的信息。我還沒有嘗試基於GPU的,所以我會研究它。由於之前做過這些的人的提示,我專注於srand/rand方面,但在我看來,除非他使用「使用5.004」那麼沒有足夠的(簡單)打破蘭德的方法。 – Reni

+0

花了一個星期後,我終於明白perl rand的工作原理了。
1)在perl的第一個rand將調用srand(),它使用整數值作爲種子(2^32)的可能性,但是REAL種子有2個未使用的尾部字節。 2)每一個rand實際上都會使用UNIX drand48()並在文檔後改變種子。 – Reni

相關問題