4.5.1 覆盖PEB

小知识:PEB和TEB

PEB,指进程环境块。TEB,指线程环境块。

在编程实现时,可以通过FS寄存器找到TEB、PEB甚至默认堆的起始地址。具体说,就是FS:[18]→TEB;TEB+30→PEB;PEB+18→默认的堆地址。在ShellCode高级编写中会有详细讲解。

“在NT4/Windows2000/XP下,PEB的值都是固定的,都是0x7FFDF000。而在PEB偏移0x20的地方(即0x7FFDF020),有一个函数指针——RtlEnterCriticalSection()函数的指针。如图4-50。”

“哦,莫非我们可把where覆盖成它?”玉波问道。

“对!RtlEnterCriticalSection()函数很多地方都要用到,我们如果把0x7FFDF020覆盖成ShellCode的地址,那么系统调用RtlEnterCriticalSection函数时就会进入我们的ShellCode。覆盖示意图如图4-51。”

“哦!0x7FFDF020这个地址对所有版本和系统都是通用的;那我们可得到版本无关的覆盖了?”大家说道。

“是的,这是该方法最大的优点;但也有缺点,就是需要目标程序在后面调用RtlEnterCriticalSection()函数才能进入我们的ShellCode。”

“的确是这样啊!”

“而且这样的覆盖也有可能会引发异常。所以能否进入我们的ShellCode,就需要具体程序具体分析,不能一概而论。”