轻松将 jmp esp 方式 改写为 jmp ebx 方式
写这篇文章,希望能给想我一样的初学缓冲区溢出的菜鸟一些帮助,因为到现在的确
还没找到介绍这类的文章。首先,介绍在堆栈溢出中,我们的两种利用方式—jmp esp 和
jmp ebx;接下来,说明了其转化的简单方法;最后给了两个实际例子,将 isno 写的.printer
利用代码和 flashsky 写的 RPC 利用代码改写成 jmp ebx 的方式,以实现对 win2000 sp0-sp4
全版本的统一!!
小知识:关于 jmp esp 和 jmp ebx。在溢出中,我们是通过构造过长的数据,覆盖系统
中原来的东西,然后想办法跳到我们自己想执行的程序中去。这里的说的跳转办法最经典
的就是 jmp esp 和 jmp ebx 这两种---在某个地方,覆盖系统原来的东西为 jmp esp 或 jmp ebx
的地址,这样就可以跳到我们想执行的程序中去了。当然,我们想执行的程序,也是我们
自己写的,通常就称为 ShellCode。跳转的原理,请看下面的分析。
一、利用 JMP ESP 的方式
其 利 用 格 式 是 NNNNNNRSSSSS , 这 里 N=NOP , R=RET ( jmp esp 的 地 址 ),
S=ShellCode。就是把缓冲区一直覆盖成 NOP(空指令,什么都不做),直到原来的 EIP 位
置时,我们填入系统中某个核心 dll 中的 jmp esp 的地址,紧跟后面才是我们的 ShellCode。
这种方式为什么会执行到 ShellCode 呢?正常情况下,函数返回时,执行 RET 指令,
这等于 POP EIP,会把保存的原来程序的 EIP 的值恢复,从而完成中断的返回。但在这里,
我们把保存的 EIP 的值覆盖了,改写成了 jmp esp 的地址。这样,POP EIP 后,EIP = jmp
esp 的地址,而堆栈指针 ESP 会往下走,指向 ShellCode 的开始。程序继续执行,此时 EIP
里的内容是 jmp esp,系统执行 jmp esp,就正好就跳到我们的 ShellCode 的地方了。
小知识:push 和 pop。堆栈是一数据结构,遵循“先进后出,后进先出”的规则,就像我
们平时叠盘子一样,先放在下面的最后才能取出来,最后放上去的最先取出来。而在操作
系统中,存和取的动作就是 push 和 pop。Push 放一个数据到堆栈中去,Pop 取一个堆栈中
的数据出来。
如果 ShellCode 是开个端口,那我们就可以远程连上去;如果 ShellCode 是下载执行,
那我们就可以让目标机在网页上下个文件并执行……只要你想到达的功能,都可以想办法
实现。ShellCode 的写法以后有机会再讨论,在这里,还是看看我们关心的地方,
二、利用 JMP EBX 的方式
其利用格式是 NNNNN JESSSSSS。这里 N = NOP, J = Jmp 04,E = jmp ebx 的地址,S
= ShellCode。
这里的 J 和 E 的位置是关键,E 是在出错处理的入口位置,而 J 在其前面。
在第一种方式中,我们知道将返回地址覆盖成另一个地址。但如果是个无效的地址呢?
那里指向的数据或许不能读,或许不能执行,那会怎么样呢?其实相信大家都遇到过,那
就是系统会弹出个对话框报错,我们点确定,就会终止运行。
这是因为作为一个系统级的程序,内部有健全的出错处理机制。简单的说,如果运行
时有错误产生,windows 就会跳到一个专门处理错误的地方,对应不同的错误,执行不同
的代码。上面执行的代码就是弹出个对话框报错。
所以这里我们故意把返回的地址覆盖成一个错误的地址。这样出错时, windows 就会
跳到处理错误的入口,而 ebx 指向入口前 4 个字节的地方!那我们把错误入口处覆盖为 jmp
ebx 的地址,就会跳到前 4 个字节,怎么跳到 ShellCode 呢?在这里我们写入 jmp 04,哈哈,
往后跳 4 个字节,正好跳过覆盖值,达到我们的 ShellCode!
三、JMP ESP 方式转换为 JMP EBX 方式
1、 为什么要考虑把 JMP ESP 方式转换为 JMP EBX 方式呢?
其实最大的好处是,JMP ESP 在各个系统,各个补丁版本上是不一样的,这样就
- 1
- 2
前往页