5.7.2 XP下SEH的利用

“好,我们看看,本来ebx应该指向0x33333333,我们CALL EBX就可跳到0x33333333那句指令。但在XP下这招不行,要用另一种方法了。”

“哦?什么方法呢?”

“呵呵,系统总要知道指向下一个异常处理点的位置嘛!大家仔细找找看,寄存器或寄存器内存附近有什么指令指向0x33333333?”

大家仔细的找了起来。

“哦!esp+8的值为0x0101D2DC,而0x0101D2DC存的正好是我们的0x33333333,如图5-25。” 眼尖的小倩说道。

“是啊!”其他人也欢呼道,“原来是堆栈中存着地址啊,而且是栈顶+8的地方。那XP下可以用这个地方来定位了!”

“是的!这就是XP下利用异常处理点的方法。”老师说道,“我们把CALL EBX指令的地址改成pop pop ret指令的地址;当执行pop pop ret后,就会到异常处理点程序入口点前方的位置,我们把那儿覆盖成JMP 04,就可跳到后面的ShellCode了。如图5-26。”

  

“好了,无用字符应该填充多少个呢?”老师问道。

“刚才我们定位时,输入的参数是11112222到0000的不断循环,Ollydby里显示的出错位置是第二个3333和4444,所以我们可以算出12×4=48,加号要占一个字符,所以应该是MDTM命令加号后再填充47个字符到达异常处理点。”宇强分析道。

“漂亮!Perfect!”老师表扬道,我们利用的示意图就应该如图5-27。”

“pop pop ret指令在Windows下通用的地址是0x7FFA1571;JMP 04的指令是EB 04。”老师最后说道,“ShellCode我们就随便使用一个现成的,或我们自己写的就行,所以,具体构造应该如图5-28。”

“好啊!我们快试试吧!”同学们急切的说,“先填充字符,再JMP 04,然后是0x7FFA1571,最后是我们的ShellCode,就开一个远程端口吧!运行!”

过了一会玉波说道:“哎哟,Serv_U是挂掉了,但端口没有开起来。”

“啊?这是怎么回事呢?”大家不解的问,“就是按照要求构造的啊?”

“呵呵!那是因为我们的ShellCode太长,被截断了!”