(其他大神,請略過)
這是我的原始碼
直接到進入點內
按照經驗,esp+0x1C是變數a,裡面存放著16進位7B,就是123
scanf執行完,就會請你輸入數字,隨便輸入321看看。
按下enter,他就執行到00401536的位置。
cmp eax,esp+0x1C
eax跟7B 做比較,從計算機已經得出數字了
eax 是我們輸入的321轉16進位變成141
兩者不同,就跳轉。
jnz short 0040154E
也就是這行
輸出false 資訊
jmp short main.00401516
代表跳回去剛開始輸入的地方
這段很好判斷成while(1),預設值為1,代表重複
可能有人會說,那如果不知道密碼隨便輸入,想要正確的顯示correct可以嗎?
當然可以,那這樣等於破解
那要如何破解? 這也很容易理解
比較一下eax與esp+0x1C 這兩者
jnz 意思是若不等於0,則跳躍,141與7B 兩者不同,回傳的是1,那麼就跳躍。
查看暫存器的EIP下面那邊 有一個Z 旁邊寫著0
如果不等於0,就跳轉,那這個狀態就是一定會跳轉。
如何讓他不跳轉? 很簡單,在Z的旁邊 把0 按兩下,他就不會跳轉了。
如果你覺得這樣還不夠,當然的,因為只是改變了0與1的變化。
這篇文章教的是如何破解,意思就是要打補丁。
這個程式打補丁很好理解。
在組合語言視窗上面,在jnz那行快按兩下,或是按空白鍵,即可彈出這個對話框。
直接把jnz的"n" 去掉,然後什麼都不做,再按下assemble按鈕
讓他變成等於的狀態
他自動會變成je,也就是兩者等於的時候才跳轉,因為我們的141不等於7B,所以就不跳轉了。
接著,我們就會看到他顯示correct的字樣,代表已經修改成功,但這還沒到patch的效果,畢竟都還沒匯出成一個修改過的執行檔。
在OD組合語言視窗內,隨意按滑鼠右鍵。如下圖。
然後再按右鍵,如下圖
按下去之後,他會顯示跟這張圖片一樣的對話框,
按下去後,他會顯示成這樣。
patch那個視窗就是你打的補丁。
我們著重再前面畫紅色圈圈的這個視窗
再次從這視窗中的隨意一處按下右鍵,選擇save file
儲存到你自己看得到的地方,儲存後,這樣就是成功打補丁了。
這招"不是"萬用,如果是正常的密碼,他就會落入false的那行了。
有另一個方式,就是用nop。
在jnz那行,右鍵選binary-->File with NOPs
把jnz那行,全部Nop掉。
然後到這邊跟之前匯出的方式一樣,進行匯出。
這樣一來,不管輸入什麼,通通都會到correct那邊了。
下個指令就是jmp short main.00401574
跳到結束,也就是原始碼的break。
直接離開此程式。
這篇分析密碼到這邊結束。
有著作權,請勿任意轉載。若要分享,請註明本篇來源。