【
如需要轉載,請先聯繫ChaMd5安全團隊授權。
未經授權請勿轉載。
】
NSCTF "SteinsGate"詳細writeup
From ChaMd5安全團隊核心成員 sherlly
0x00 前言挺不錯的一道題,思路值得學習,所以簡單記錄下。
0x01 恢復文件查看文件頭為PK,改後綴名為zip,解壓得到三個文件,分別是
0x02 讀加密算法邏輯算法邏輯主要可分為兩部分:
1.對t0的求解。
其中t0的值和作業系統平臺(Windows/Linux/Darwin),字長位數(32/64),當前用戶uid,隨機小數r(範圍0-2,且最多6位小數),m的md5值有關。
這裡還可以知道t0的位數應該在48左右(5+2+2+7+32)
2.對t1的求解及使用
t1的值由flag的值和t0異或得到(位數也在48左右),之後算法使用了給的圖片文件(DivergenceMeter.jpg),在文件中找和t1各個字符(t1[i])相同的值img[k],並提取索引值k,轉換為字符(k與255取模保證在ascii碼範圍內),遍歷t1生成表l,l的結構大致如下:
得到表l後,縱向遍歷該表,並把讀取數據寫入result,最終得到加密後的flag文件flag.enc。
0x03 恢復t1由上述邏輯可知,突破點在flag.enc,假設t1取48位,則flag.enc的前48位應該是t1[i] (i=0,1,…,47)的第一個元素,即chr(k1),因此可以通過遍歷圖片文件,將t1的值擴大到包含所有字符(256個)的類表l的索引表table:
得到表table後,遍歷該表的table[i][0]查找和flag.enc的前48位(記為head)分別相同的索引值轉ascii並記錄,得到t1。
這裡有個問題,存在多個table[i][0]和head[j]相同的情況,因此還要判斷table[i][1]的情況。列印出幾個值判斷下:
由於t1位數限制關係,因此table[i][1]應該和table[i][0]距離不遠,在文件中查找,基本可以確定A9是t1構成的表l[0][1],因此確定了i,從這裡也可以得到t1的實際位數應該是45位,之後的寫個代碼取flag.enc的46位開始和table[i][1]判斷下就可以,具體看最後的代碼實現部分。
0x04 恢復t0上一步中得到了t1,因此這一步主要是通過以下幾方面確定t0的值:
1.確定作業系統及字長位數
根據題目提示,flag.txt中含完整flag,也就是說前幾位為』flag{『,將已知的flag與t1異或得到t0的頭幾位為』Darwi』,基本確定作業系統為』Darwin』,又因為python文檔中寫明若為該類型時機器為64位,故得到t0的前8位為』Darwin64』。
2.確定32位md5值
根據題目提示,flag的最後一位應該是』}』,因此md5的最後一位與t1的最後一位異或得到的值應該是』}』,運算得知為』e』,即得到的md5最後一位應該是』e』。
m的前幾位已知為『64bit』,開始爆破uid和r1,r1由已知應該是1到3位,uid的位數可以通過t0確定(由於t0為45位,r最少為1位,可以算出uid位數應該在1-4之間[1,45-8-32-1])
寫腳本爆破並對求得的符合要求的md5值(末位為』e』)與t1的末32位異或,找到符合要求的部分flag(只含字母、數字、』_』、』}』)
得到部分flag:』ce_0f_st3ints_G4t3_1p048596_233}『
對應md5值為afe46f1497072540f60d793e1e5a2a6e,uid為520,r1為125
3.確定r值
由上述uid的值可以確定r的位數應該為2(45-8-32-3),注意到r的第一位不是0就是1,寫腳本爆破並組合成最終的t0和t1進行異或,列印出符合要求的flag(只含字母、數字、』_』、』{『,』}』)。
這裡有個問題,uid為520時列印出的flag為flag{to7^im91ce_0f_st3ints_G4t3_1p048596_233},改了uid為420才輸出成功。
最終t0:Darwin6442000afe46f1497072540f60d793e1e5a2a6e
最終flag:flag{to7_im91ce_0f_st3ints_G4t3_1p048596_233}
0x05 解密腳本(微信對圖片的壓縮實在令人厭煩,建議在手機端觀看)
歡迎各位大牛指點 歡迎各位大牛投稿
關於文章的建議和意見都可以留言告訴我們呢
(撒花)
投稿至:admin@chamd5.org
ChaMd5的小八卦全在這裡喲~比心❤
.ChaMd5安全團隊.
悄悄的告訴你
關注會有小驚喜