先執行程式看效果
點選按鈕直接崩潰,同時由於程式放到32位的xp虛擬機器中不能執行,判斷是64位程式。
根據提示程式本身就是有問題的,所以直接上ida pro,發現是用upx加了殼的:
使用upx脫殼看看
成功!執行ch3_d.exe看看效果
這效果。。。直接不能執行了,脫殼之前還可以彈出視窗來著!再從新脫一次殼,還這樣,好吧,it's a trap!
用windbg分析一下崩潰的原因:把windbg註冊為及時偵錯程式,再執行ch3_d.exe
崩潰的位址為
00000001`3fc81dcd 85c0 test eax,eax
ida pro中檢視導航到該位址,發現載入的基址不對(往下看就知道原因了),在windbg中用lm命令看一下模組情況
基址為13fc80000,在ida pro中rebase後,檢視崩潰點
改完登錄檔,重啟,執行程式,成功!激動地去點【find the key】,崩~~,windbg彈出來了,又崩潰了!什麼情況?沒辦法,繼續分析,看一下崩潰點附近的情況
載入decryptdll.dll,匯入rasdecrypt函式,decryptdll.dll在哪?還能在哪,估計就在ch3_d.exe的"肚子裡了",用resource hacker看一眼
果然有個dll,匯出來重新命名一下,再執行,我看你還崩!?
額,好吧,果斷的。。。windbg又彈出來了,不費話了,看看什麼情況,
崩在decryptdll的rsadecrypt函式裡了,用ida載入decryptdll看一眼(注意基址),
是崩在memcpy函式了,根據64位程式的呼叫約定,memcpy的三個引數依次為rcx(dst),rdx(src),r8(len),使用windbg跟蹤到call memcpy
暫存器情況如圖,rcx=0,rdx=21dc56,r8=15,可見是目的位址rcx的問題,在ida中跟蹤rcx,最跟蹤到
decryptdll!rsadecrypt的r8引數,r8應該是個有效的位址。
看一眼ch3_d.exe呼叫decryptdll!rsadecrypt時的引數情況
好吧r8=0,怪不得呢,看原始碼是故意用xor給清空了
那麼只要在呼叫decryptdll!rsadecrypt之前把r8改成乙個可寫的位址就行了,在該位址得到如下字串
但是彈出的對話方塊中沒有任何內容,但是看大神說這就是flag,就不繼續分析了。
k
*&>(
da30_q
-(pkd23@
,
來自為知筆記(wiz) leetCode題目解析
給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8原...
CourseGrading 題目解析
問題描述 若某元素在一組數中比它大元素越多,則說明這個數在這組數的值就越小。現請你統計出陣列中的每個元素,數一數該陣列有多少個元素比它大。輸入形式 第一行 n 第二行 n個整數 輸出形式 n個整數,各數這之間有1個空格 樣例輸入 5 4 6 12 16 8 樣例輸出 4 3 1 0 2個人答案 in...
2023年華為上機題目
華為2014校園招聘的機試題目和2013年的完全一樣。一 題目描述 60分 通過鍵盤輸入一串小寫字母 a z 組成的字串。請編寫乙個字串過濾程式,若字串中出現多個相同的字元,將非首次出現的字元過濾掉。比如字串 abacacde 過濾結果為 abcde 要求實現函式 void stringfilter...