171114 逆向 以CM為例學習MFC機制

2021-08-11 02:34:14 字數 2003 閱讀 1735

1625-5 王子昂 總結《2023年11月14日》 【連續第410天總結】

a. 謎之crackme

b. **就不說啦,總之是個mfc程式,執行介面如下

可以看到沒有確認按鈕,一般來說是由定時器訊息或text內容改變訊息觸發check函式

確認無殼後拖入ida查詢字串,輕鬆定位到sub_401cd0

但是向上查詢交叉引用卻發現落入乙個偏移中,無從下手了

對其下斷,進行動態除錯也沒有觸發斷點

說明這個函式被呼叫是有條件的

於是轉換思路,選擇getwindowtext這個api進行下斷,果然斷到:

向上檢視交叉引用,發現有很多次

於是在od中關注getwindowtexta的取回輸入的驗證碼時的呼叫堆疊,鎖定sub_401ad0

剛開始沒反應過來v9+96和v9[24]是什麼東西,沒頭沒尾的……

後來下斷、觀察彙編才發現是同乙個值

被ida反編譯給坑了:v9的型別是dword,4位元組,於是v9[24] =*(v9 + 24*size) =*(v9 + 96)

也就是說

*(v9+96)稱為flag

flag的初值為0(2+1%3)

於是get兩個text並比較長度

當輸入值為5時,對0、2、4作差(-0-1)

後跳入label_15,將flag改為1

然後對1、3作差(-1-1)

再跳入label_15,將flag改為2

於是進入校驗部分,strcmp兩個text

也就是說要求input作差後==admin(所以註冊碼為bfnko)

成功後呼叫sub_4d7d49,其中有乙個sendmessage,傳送了0x401訊息(自定義)來觸發校驗函式

至此,大概流程就結束了

不過當然不會這麼簡單啦

除了正向斷getwindowtext的api,跟蹤輸入流找到校驗的方法以外,還可以通過逆向回溯訊息傳送的方法來找到成功的條件

之前對sub_401cd0函式的跟蹤到表就斷了,這次好好研究了一下mfc的機制,再戰結構體

大概能猜測它是乙個類似虛表的東西,由乙個指標指向函式指標陣列的開頭,然後通過偏移來呼叫

那麼問題就是找到是什麼訊息觸發了它,這個偏移機制是怎麼來的

查詢了一番發現這裡的講解比較詳細:

簡單來說有乙個訊息對映表,其中有乙個指標指向訊息對映結構體陣列,每個結構體中儲存了訊息值、控制項id和響應函式的位址

我們之前跟蹤到的地方就是對映結構體,通過向ida新增結構體並標識可以令其識別:

另外還可以通過工具來直接查詢:

可以看到它準確的識別出了訊息0x401,指向了sub_401cd0函式

sub_401ad0的呼叫則是定時器timer引起的

知道了0x401訊息,只要直接搜尋立即數即可:

也能追到timer函式中的sendmessage

c. 明日計畫

re練習

室內導航學習筆記 以WIFI為例

用wifi實現室內導航涉及到兩個步驟 測距和定位。總的來說,測距技術又包括以下三個關鍵步驟 測距方式 訊號的濾波以及測距模型的選用。測距方式包括toa time of arrival tdoa time difference of arrival aoa angle of arrival 以及rss...

資料庫學習記錄(以MySQL為例)

docker pull mysql latest docker run restart always name study mysql p 3306 3306 e mysql root password 123456 d mysql latest 登入容器 docker exec it study ...

程式設計師如何高效學習(以 Java 為例)

身處乙個需要終身學習的時代,如何高效的學習是一件非常值得研究的事。對於程式設計師來說更是如此,2 年不學,你可能就被時代拋棄了。對於初學者來說,最大的幸運就是在一開始就找對了方向。怎麼去學,學到什麼程度,學習方式是什麼,要學多久。如果一開始就能有乙個概念,那麼學習過程中就會事半功倍。對於有了一定經驗...