【reversing.kr逆向之旅】Replace的writeup
無殼 vc++程式
載入Olydbg動態除錯分析就好
可以通過下API斷點GetWindowTextW來找到關鍵程式碼
因為它就是用來捕獲我們的輸入的 隨意輸入(這裡可以發現只可以輸入數字 長度什麼的倒是沒有限制)
就像下面一樣 可以看到地址很大 在系統領空 user32.dll 所以這裡不用管
上面迴圈過去之後
就來到了這裡
可以看到成功的標誌Correct!
但是CPU視窗有兩個jmp指令 也就是說無條件跳轉 肯定無法成功 向上向下跟蹤 可以看到只有地址00401071處有一個跳轉進來 可以使我們走向成功
接著向下單步 來到下圖所示
可以發現 程式不管輸入什麼 總是走到0x004046A9這裡就停止運行了
可以看到這個call跳轉向的地址 是將eax所對應的地址進行nop
連續兩個這樣的call 中間inc eax 就是eax加1 也就是說連續nop兩個地址
再來看下邊那個向上跳轉的jmp 跳轉的地址0x00401071 對應其中一個jmp 挨著的下一條指令正好是個空指令
那麼我們就可以利用這兩個call 將這兩條指令進行nop 即可走向Correct!
這時候重點就在eax是如何與我們的輸入進行運算的
輸入123時 eax=0x60160646 把123轉成十六進位制是0x7b 0x60160646-0x7b=0x601605cb
重新輸入1234時 eax=0x60160A9D 把1234轉成十六進位制是0x4d2 0x60160A9D-0x4d2=0x601605cb
多次輸入 可以發現最終結果都是0x601605cb
那麼我們正確的輸入應該要滿足0x00401071-?=0x601605cb
可以發現需要eax溢位才可能成立
所以?= 0x100401071-0x601605cb = 0xa02a0aa6
驗證2687109798 成功
參考連結: