1. 程式人生 > >bugku 逆向之consoleapplication4(遊戲過關)

bugku 逆向之consoleapplication4(遊戲過關)

一頓分析

對於一個逆向小白來說,在這題上著實花了點時間,特記錄下~

初看這題時,感覺就是資料題,經過一頓操作,發現1-8依次輸一邊,答案就出來了,反正每盞燈只能操作奇數次。

但是這樣的方式做一道“逆向”題,著實沒啥成就感,反正剛學習,那就從簡單題開始吧。

載入Ollydbg先看看,通過查詢參考字串找到了函式的地址00B7E940

右鍵檢視呼叫樹(或者右鍵轉到,可以看到最下方是呼叫地址),可定位到函式呼叫處

(呼叫樹)

(上一個jmp)

(關鍵判斷處)

我們找到了一個jnz和call的地方,因為不是flag的直接比較,所以想法是跳轉至成功函式輸出flag,或者直接將生成flag的函式吃透。

方法一:修改彙編程式碼完成跳轉

我們找到了一個jnz和call的地方,因為不是flag的直接比較,所以想法是跳轉至成功函式輸出flag,或者直接將生成flag的函式吃透。

(修改彙編)

(新檔案)

直接執行,即可獲得結果

方法二:瞭解flag的生成

前面在除錯時我已經大致瞭解了生成的方式(也在堆疊中看到了flag),現在我們載入IDA進行檢視,由於OLLY的地址(每次基址都變)和IDA的地址顯示有區別,這裡還不會對應找。

但是學會了搜尋關鍵字串

同時也找到了呼叫函式sub_45E940,

後來跟著動態除錯進行測試發現邏輯程式碼如下

存在兩個陣列(擷取片段示例)

先兩個陣列按位異或,再與0x13異或。

關鍵函式

python程式碼

ss4 = [0x12,0x40,0x62,0x5,0x2,0x4,0x6,0x3,0x6,0x30,0x31,0x41,0x20,0x0C,0x30,0x41,0x1F,0x4E,0x3E,0x20,0x31,0x20,0x1,0x39,0x60,0x3,0x15,0x9,0x4,0x3E,0x3,0x5,0x4,0x1,0x2,0x3,0x2C,0x41,0x4E,0x20,0x10,0x61,0x36,0x10,0x2C,0x34,0x20,0x40,0x59,0x2D,0x20,0x41,0x0F,0x22,0x12,0x10,0x0]

ss8 = [0x7B,0x20,0x12,0x62,0x77,0x6C,0x41,0x29,0x7C,0x50,0x7D,0x26,0x7C,0x6F,0x4A,0x31,0x53,0x6C,0x5E,0x6C,0x54,0x6,0x60,0x53,0x2C,0x79,0x68,0x6E,0x20,0x5F,0x75,0x65,0x63,0x7B,0x7F,0x77,0x60,0x30,0x6B,0x47,0x5C,0x1D,0x51,0x6B,0x5A,0x55,0x40,0x0C,0x2B,0x4C,0x56,0x0D,0x72,0x1,0x75,0x7E,0x0]

flag = ""
for i in range(0,0x38):
    flag += chr(ss4[i]^ss8[i]^0x13)
print flag

執行如下