1. 程式人生 > 實用技巧 >CTF入門—PWN:random

CTF入門—PWN:random

Hash-CTF PWN入門題random

Part1:編譯

正常操作:die檢視為64位,拖進IDA,按下神奇的F5,找到主函式。

我們看到了一個重要函式gets(),這是一個對輸入沒有限制的危險函式。程式碼很直白,就是以seed[0]為種子生成隨機數,每次對隨機數模6加1,一共驗證十次。眾所周知,rand()函式是一個偽隨機函式,只要我們控制了種子我們就可以“猜”出來它的值。

Part2:介紹隨機函式的相關知識

根據C++的文件我們可以知道,rand()是一個偽隨機數生成器,srand()對於相同的種子會將rand()函式初始化為相同序列,每呼叫一次rand(),就從序列中取出下一個數字(注:這裡才用的是一種線性同餘或線性遞迴的方式實現的),所以我們只要讓程式按照已知的一個隨機數種子執行,我們就可以推知它的結果。

想要呼叫dll中的rand()和srand()函式需要一個python的外部函式庫——ctypes。ctypes是python的一個外部庫,提供了與 C 相容的資料型別,並允許呼叫 DLL 或共享庫中的函式。可使用該模組以純 Python 形式對這些庫進行封裝。這裡使用該庫,用來呼叫srand()和rand()函式。在 Linux 下,必須使用 包含 副檔名的檔名來匯入共享庫,可以使用 LoadLibrary()匯入庫。

Part3:程式碼實現

由反編譯程式碼可知,gets()輸入距離seed[2]相差0x20欄位,隨便填充一下,再選擇一個數字覆蓋seed[],這裡我選擇了”1“,呼叫ctypes庫中的cdll.Loadlibrary('libc.so,6')建立一個CDLL物件,在通過物件呼叫srand(1),迴圈十次呼叫elf.rand()。執行sub_C3E9(),於是我們就獲得了許可權。

提示:指令碼程式碼採用python3語法編寫,請結合實際情況修改。

相關資料:

1.偽隨機數生成器(維基百科)

2.ctype庫(python標準文件)