4.3.3 跳转和构造

“第三步就是实现跳转到ShellCode中。”老师说,“现在,大家类比刚才的例子想想,知道该怎么做了吧?”

“嗯,在消息段中,先覆盖2263个无用字节进行填充,这样就到了堆管理块;用NOPNOPJmp 08覆盖管理块,用来跳过后面的what和where,然后进入最后的ShellCode中。”古风说。

玉波也抢着回答:“而我们把what覆盖成 call[esi+4C] 的地址,把where覆盖成默认异常处理地址,后面跟ShellCode,就像图4-37一样。”

“这样,在what→where的操作时,就会把顶层异常处理地址覆盖成 call [esi+4c] 的地址;发生异常后,就会执行 call [esi+0x4C] ,跳转到堆管理结构中;那儿我们正好放的是 JMP 08 ,这样跳进最后的ShellCode中了。”宇强也把流程说了一遍。

“非常好!”老师很满意大家的表现,“特别是在Windows2000 SP3下, call [esi+4C] 指令的地址是0x77e2f91f,顶层异常处理地址是0x77ec044c,这是我们在前面得到的。这样,数据构造就如图4-38所示。”

“好了!”老师说道,“我们就这样构造出了消息部分数据,再加上其他的数据头等结构,得到程序message.c。我们把数据发给有漏洞的目标机,目标机就会跳过去执行我们的ShellCode。”

“实际测试一下,我们先在‘工程→设置’里设置要攻击的主机,如图4-39。”

“再编译、执行。目标机上就会出现图4-40的效果。”

“哦!引发了错误!”同学们叫道。

“是的,那是Services系统服务异常后引起的。但我们可以看到,已经加上了一个名为‘X’的用户,完成了我们想要的功能!”

“是啊!是那换成其他功能的ShellCode也可以么?”

“当然可以,只要那个ShellCode符合堆漏洞的条件就行,大家下去可以自己测试。好了,我们休息一下!”