Reversing.Kr Replace Writeup

打开程序看到了wrong,打开OD字符串搜索

Reversing.Kr Replace Writeup_第1张图片

发现Correct!双击进入

Reversing.Kr Replace Writeup_第2张图片

GetDlgItemInt获取输入,

同时猜测0040466F是进行一些处理,先在这里下断点,

顺着程序往下看,下面有两个jmp,第一个jmp最后会跳转至第二个jmp处,但是第二个jmp会直接跳过correct!       

Reversing.Kr Replace Writeup_第3张图片

(这里的时候百思不得其解,以为要nop掉第二个jmp)但其实不是让自己nop掉,是要根据输入来让程序自己nop掉。

开始调试程序:

输入个123(7B)

来到第一个jmp的地方

Reversing.Kr Replace Writeup_第4张图片

这里发现0040469F处,将一些奇怪的指令传递(修改)至0040466F,然后又调用了两次0040466F,之间还让eax自加1

看一下修改后的是什么指令:

Reversing.Kr Replace Writeup_第5张图片

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

Reversing.Kr Replace Writeup_第6张图片

 

 

 

你可能感兴趣的:(Writeup_RE)