1. 程式人生 > >171220 逆向-i春秋【迎聖誕】-NoExec

171220 逆向-i春秋【迎聖誕】-NoExec

1625-5 王子昂 總結《2017年12月20日》 【連續第446天總結】
A. i春秋【迎聖誕】-NoExec
B.
字尾名寫著exe,卻不能執行~
用010Editor開啟分析一下
發現NT頭有很明顯的問題
這裡寫圖片描述
MagicNumber應該是50 45 00 00,被改為了HA
後面一個HA很明顯也是後加的,查詢一下發現這裡是Machine,表示使用的處理器
正確的值應該為4C 01,即i386 - 332
修改以後發現還是不能執行,繼續檢查
想起來DOS頭裡有一個重要的值:e_lfanew,它表示了NE頭的偏移
原值為00 01 00 00,很明顯是錯的,改正為10 01 00 00(0x110)
改完發現Windows都能識別出來它是個MFC了
這裡寫圖片描述


然而雙擊以後響應了一會兒還是沒東西出來

拖入OD也在載入器中就跳入SEH了,估計載入的時候還有什麼錯誤,當時沒有發現
但是知道它是MFC就有地方可以操作了:
無殼,拖入IDA,發現WinMain函式裡沒有好辨認的東西,查詢字串也沒有可讀的部分╮(╯_╰)╭
於是開始考慮從資源下手
用ResourceHacker檢視控制元件ID,發現確認按鈕的ID為1001
於是根據ID定位按鈕函式,通過IDA的搜尋立即數
(結構體自己匯入)
這裡寫圖片描述

這樣就找到了函式:sub_402C30
結構很明顯
這裡寫圖片描述
檢視check函式,發現先是通過下標的奇偶將字串切成兩個
這裡寫圖片描述
然後分別將兩個字串base64,再連線起來
這裡寫圖片描述

之後大段的程式碼太長不想看(。
反正沒有對v76操作的地方

最後可以看出來是和一個字串比較
這裡寫圖片描述

直接把它拖下來解b64發現不可見,說明中間還有操作

到這裡就陷入了僵局
回頭重新研究
發現當用IDA除錯的時候會報start函式執行失敗
這個提示讓我茅塞頓開,節區屬性的可執行屬性被關閉了!
原來題目名“NoExec“就給出提示了╮(╯_╰)╭奈何一直沒get到

於是將程式碼所在節區.text的屬性加上可執行(DWORD Executable : 1)
這裡寫圖片描述
就可以運行了!

在OD中對剛才分析的結果b64後的字串下斷,斷到sub_401EC0->sub_401CE0中進行了操作
在IDA中大概看了一下,很複雜╮(╯_╰)╭
掏出密碼學分析外掛看一眼,哼,果然在這個函式裡有對DES_box的呼叫
那這個sub_401EC0就是DES沒跑了

OD中對這個函式下斷,發現它是每次擷取8個字元進行DES,金鑰通過對引數的觀察發現是

6E 06 15 51 93 5B 07 EA

IDA中大概能看到是上面一堆複雜操作出來的….看不懂(望天
跑了一下發現這個金鑰是不變的
解密出來由於是二進位制值,所以還有一次base64轉為可見字元

於是按照思路寫出解密指令碼:

from base64 import b64encode, b64decode
from Cryptodome.Cipher import DES

k2 = [0x6E, 0x06, 0x15, 0x51, 0x93, 0x5B, 0x07, 0xEA]
key = bytes(k2)
x = DES.new(key, DES.MODE_ECB)
s = b"GcDk0SvnNA1tsmp5FCK1FpSDfUXZbhHBSPheZaixuMyzqyysOAPCPB/p7sMpmK1KZo+lPfhMZxw="
c = b64decode(s)
# 解密
p = x.decrypt(c)

# 還原奇偶字元
x = b64decode(p)
y = b64decode(p[28:-4])
for i in range(37):
    if(i%2==0):
        print(chr(x[i//2]), end='')
    else:
        print(chr(y[i//2]), end='')

活動頁面上寫著難度為中下,不過這個題目著實難了我一會兒(:з」∠)
雖然覆盤想想好像的確沒有太複雜的東西,但是各種小細節還是挺麻煩的
學到和鞏固了很多知識~感謝出題人和i春秋提供的題目(°∀°)ノ

C. 明日計劃
加密與解密/看雪題目