HCTF 2017 bin Level1 Evr_Q Writeup

        HCTF 2017完結撒花,萌新領教到了賽棍們的強大,但也有了一些自己的收穫。我想將其中一些題的思路記錄下來,一是記錄,二是與有需要的人分享,當然本篇WP和大佬們的比還是很菜。話不多說,進入正題。

        首先我們拿到一個看起來很吊的程序,如下圖:


        例行公事,PEID查殼,查到EP段有加殼,但是不影響我們Crack


        直接上神器X32-DBG,考慮到殼的關係,附加到程序進程,來到主程序模塊發現什麼都沒有


        搜一下字符串發現有這麼多


        找到看起來比較關鍵的字符串點進去,我們的老朋友:彙編代碼就回來了


        接下來可以查看check user後幾個關鍵call,發現程序將用戶名倒序,再對用戶名中每個ASCII字符對應的十六進制作XOR,AND等一系列運算,最後與密文比較,根據這個,我們直接就能用十六進制計算器反算出正確的用戶名原文爲:M.KATSURAGI。實際上直接改跳轉也能使驗證成功,且不會對我們get flag造成任何影響,但穩妥起見,還是按流程走吧。



        輸入正確的用戶名,程序彈框提示驗證成功,但由於程序有反調試,所以在彈框後可能會自動退出,我們能輕易找到反調試的代碼,在所有exit調用函數處下斷,我們再運行

        發現罪魁禍首原來不在剛纔那裏,而在此處被斷下來,修改前面的je跳轉,彈框後便不再退出


        接下來進入重頭戲,程序要求我們輸入Start Code,按照常識,這應該就是我們要找的flag無疑,所以我們在check start code字符串後的getchar函數處下斷點,然後隨意輸入一個start code,單步調試一遍後,知道了各個call的功能並做好註釋

        我們現在知道程序先檢查輸入長度是否爲35,然後將輸入的start code進行XOR運算,然後取第8位到第14位,第15位到21位,第22位到28位三組7位字符串,這三組字符串分別經過方法相同但參數不同的運算,用結果替換掉原輸入對應位置的字符串,最後與密文比較。到這裏,我們可以根據程序中所給參數建立方程,方程的解即爲正確的原文,但方程比較複雜,這裏採用窮舉來解方程,我們都知道,二位十六進制數範圍爲00到FF,轉換爲十進制即0到255,於是寫出腳本如下:

def solve(idx1,idx2,idx3,idx4):
    for x in range(0,255):
        if(((x ^ idx1 )& idx2 )>> idx3) | (((x ^ idx1) << idx3 )& idx2) == idx4:
            print hex(x^0x76)
key1 = [0x6f,0xdd,0xdd,0x48,0x64,0x63,0xd7]
for ele in key1:
    solve(0xAD,0xAA,0x1,ele)
key2 = [0x2e,0x2c,0xfe,0x6a,0x6d,0x2a,0xf2]
for ele in key2:
    solve(0xbe,0xcc,0x2,ele)
key3=[0x6f,0x9a,0x4d,0x8b,0x4b,0xfa,0x1a]
for ele in key3:
    solve(0xef,0xf0,0x4,ele)

        窮舉出3組7位原文,再把35位原文經XOR得到的前七位和後七位與之前XOR運算的參數再作一次XOR運算(我們都知道,XOR運算是可逆的),最後將所有結果拼接起來放到在線16進制轉ASCII碼的網站,轉換爲ASCII碼,get flag!爲:hctf{>>D55_CH0CK3R_B0o0M!-68271c0a}


        今年hctf對bin選手不友好是真的,ORZ。總之還得多跟大佬們學學,嗯,就這樣。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章