点评:有很多寄存器在登记尽管其
功能和使用上没有
区别,但在长期的使用和编程,
程序员习惯于登记每个被赋予特殊的意义,例如有
默认:EAX用于返回值,ECX计数等。在Win32环境,EBP登记易于与ESP存储调用入口值后
退出。
有很多的寄存器在登记尽管其功能和使用上没有区别,但在长期的使用和编程,程序员习惯于登记每个被赋予特殊的意义,例如有默认:EAX用于返回值,ECX是用来计数等。在Win32环境下,使用EBP和ESP登记存储调用方便的ESP值返回退出时加入后的价值,实现栈的平衡
目标。
应用前面说过的段落:
原程序的OEP通常开始的两句话,Push EBP和mov ebp,尤其不需要提到它,你知道这两个句子的意思而不是ESP EBP作为指针访问栈。
为什么会这样为什么几乎每个节目
都是开始的因为如果我们编写了C
函数,应该清楚的是程序的开始是基于一个main函数(main)来
启动的,最重要的是在访问堆栈过程中的功能是确保在Win32环境中保持平衡的方式是这样的平衡:
1。让EBP
保存ESP的值;
2。在通话结束时
MOV EBP ESP,
pop ebp
Retn
或是它
离开
Retn
两个形式是一个意思。
这样做的好处是,我们不需要考虑多少ESP等于多少次推已成为流行,因为我们知道EBP是放置在ESP值开始。
2。ESP的泛化规律
当寻找OEP,
经常断HW esp-4是不成功的,除了外壳代码将
删除硬件断点,可能是因为在
运行代码时,他的壳OEP ESP不再在EP当ESP(12ffc4),所以我们的公开课是不成功的。
那么如何寻找叠加的价值当壳达到OEP是关键。
我们在这里应用的关键是
Push EBP
MOV EBP的关键,尤其是这句话----
让我解释一下,当程序到达OEP,Push EBP esp-4 ESP的值,然后esp-4分配给EBP和EBP的值为登记在顶层程序功能的ESP值不会改变。尽管他可能进入亚称,它将暂时改变(为子程序的堆栈平衡),但退出后,它会
恢复原来的EBP的值根据* pop ebp。
把这句话作为切入点,也就是说,只要我们能打破前的程序,我们可以观察ESP EBP JMP到OEP值时。
三.实战
让我们看看pespin1.1壳一看。在pespin1.0壳,我们可以很容易地通过使用硬件12ffc0找到被盗代码的地方,但当我们去pespin1.1,我们不能做that.hw 12ffc0不能打破所有的。
现在我们使用这个广义ESP定律将程序加载到最后一个异常。
0040ed85 2bdb子ebx,EBX / /停在这里
0040ed87 64:8f03流行DWORD PTR FS:{续}
0040ed8a EAX 58流行
0040ed8b 5d pop ebp
0040ed8c 2bff子EDI,EDI
0040ed8e EB 01 pespin1_ 0040ed91 JMP短。
0040ed90 c466 81 LES ESP,Fword PTR DS:{ esi-7f }
我使用的
内存断点的
方法来FOEP
004010d3 0000添加BYTE PTR DS:{中},Al
004010d5 0000添加BYTE PTR DS:{中},Al
004010d7 0000添加BYTE PTR DS:{中},Al
004010d9 0000添加BYTE PTR DS:{中},Al
004010db 0000添加BYTE PTR DS:{中},Al
004010dd 0000添加BYTE PTR DS:{中},Al
004010df 75磅短pespin1_ JNZ。004010fc / / FOEP是这里
004010e1 56推ESI
004010e2 ff15 99f44000叫DWORD PTR DS:{ 40f499 }
004010e8 8bf0 MOV EAX ESI,
004010ea 8a00 MOV AL,BYTE PTR DS:{中}
好了,这是程序的顶部,看看寄存器。
EAX 00141e22
0040c708 pespin1_ 0040c708 ECX。
EDX 0040c708 pespin1_。0040c708
0040c708 pespin1_ 0040c708 EBX。
ESP 0012f978
EBP 0012f9c0 / /注意这里
ESI 00141ee0
0040e5cd pespin1_ 0040e5cd EDI。
004010df pespin1_ 004010df EIP。
看,EBP = 0012f9c0,让我们想象一下这个值了。
首先,它必须通过MOV EBP,ESP,也就是说,尤其是0012f9c0此时也在顶推EBP,ESP应该到达OEP当它到达OEP。嗯,这个结论,我们可以很快找到地方偷来的代码位于。
在最后一个例外处停下来
0040ed85 2bdb子ebx,EBX / /停在这里
0040ed87 64:8f03流行DWORD PTR FS:{续}
0040ed8a EAX 58流行
0040ed8b 5d pop ebp
0040ed8c 2bff子EDI,EDI
0040ed8e EB 01 pespin1_ 0040ed91 JMP短。
0040ed90 c466 81 LES ESP,Fword PTR DS:{ esi-7f }
然后将硬件0012f9c0,F9运行,来这里
61 0040d8fb POPAD
55 0040d8fc push ebp
0040d8fd EB 01 JMP短pespin1_。0040d900 / /停在这里
0040d8ff 318b eceb01ac异或DWORD PTR DS:{ EBX ac01ebec },ECX
0040d905 83ec 44个子ESP,44
0040d908 EB 01 pespin1_ 0040d90b JMP短。
7256 pespin1_ 0040d962 0040d90a JB短。
0040d90c EB 01 pespin1_ 0040d90f JMP短。
95 0040d90e xchg eax,EBP
0040d90f ff15 6cf34000叫DWORD PTR DS:{ 40f36c }
0040d915 EB 01 pespin1_ 0040d918 JMP短。
所以很快就
发现被盗
密码在哪里。
4。总结
上述方法可能总结如下
步骤:
(1)。直接或间接地,在程序的顶部。
(2)。得到的顶级程序EBP的值。
(3)。使用两个固定报表的计划找到壳JMP堆栈值OEP初始化。这种方法有很多局限性,因为只有VC和Delphi程序使用初始化开始。
但是有很多方法可以找到top程序。除了内存断点,例如,VC,使用BP过程也是一个很好的断点,可直接得到EBP的值。
5。话
原来的方法有很强的前提
条件,这不是一个非常普遍的方法。我不想独自抚养,但jney2兄弟反ESP定律,这个
解决方案是一个解决方案。
当然,还有更多的方法。这里我只想说,很多东西都有矛和盾。不可能没有漏洞。我只希望这篇文章能给你一个广阔的思路,在营造一块砖和吸引玉方面发挥
作用。