打開程序看到了wrong,打開OD字符串搜索
發現Correct!雙擊進入
GetDlgItemInt獲取輸入,
同時猜測0040466F是進行一些處理,先在這裏下斷點,
順着程序往下看,下面有兩個jmp,第一個jmp最後會跳轉至第二個jmp處,但是第二個jmp會直接跳過correct!
(這裏的時候百思不得其解,以爲要nop掉第二個jmp)但其實不是讓自己nop掉,是要根據輸入來讓程序自己nop掉。
開始調試程序:
輸入個123(7B)
來到第一個jmp的地方
這裏發現0040469F處,將一些奇怪的指令傳遞(修改)至0040466F,然後又調用了兩次0040466F,之間還讓eax自加1
看一下修改後的是什麼指令:
0040466F $ C600 90 mov byte ptr ds:[eax],0x90
00404672 ? C3 retn
0x90就是nop,mov byte ptr ds:[eax],0x90就是將nop放在當前eax的值對應的地址處
再聯繫一下
00401071 > /EB 11 jmp short Replace.00401084
中的 EB 11 和兩次調用0040466F中間的eax自加1
可以判斷這裏就是需要將EB 11都改爲轉換爲nop(就把第二個jmp給nop掉了)
所以任務就是在調用0040466F時,令eax = 0x401071,這個就與輸入有關
而我這裏輸入的123(7B),此時的eax是60160646
我重新調試,再輸入另一個值111(6F),調試到004046A9,此時6016063A
0x6016063A – 0x6F = 6016 05CB
0x60160646 – 0x7B = 6016 05CB
即 將輸入的10進制數轉爲16進制與6016 05CB相加作爲eax,於是:
0x6016 05CB - 0x401071 = 0x A02A 0AA6(前面的FFFFFFFFF略去,因爲eax只保存後8位)
0xA02A0AA6 = 2687109798 即是flag