危险漫步博客
新鲜的“黑客思维”就是从全新的角度看待黑客技术,从更高的层面去思考;专注于黑客精神及技术交流分享的独立博客。
文章2289 浏览18790737

溢出教程——shell编写

前面危险漫步给大家简单的讲了一下溢出的原理,在前面的试验中我们向进程植入了一段代码,这段代码我们就可以称它为Shellcode。

Shellcode编写技术实际是一段代码(也可以是填充数据),是用来发送到服务器利用特定漏洞的代码,一般可以获取权限。另外,Shellcode-般是作为数据发送给受攻击服务的。Shellcode是溢出程序和蠕虫病毒的核心,提到它自然就会和漏洞联想在一起,毕竟Shellcode只对没有打补丁的主机有用武之地。漏洞利用中最关键的是Shellcode的编写。由于漏洞发现者在漏洞发现之初并不会给出完整Shellcode,因此掌握Shellcode编写技术就显得尤为重要。

了解了这些以后我们来先一个简单的shellcode,一般来说Shellcode都是用汇编语言编写的,然后转化成二进制机器码,还会受到很多限制,导致开发Shellcode的难度很高。

危险漫步记得以前说过溢出的关键就在说控制EIP寄存器,EIP寄存器指向下一句即将执行的代码,正常情况下,函数返回时会遇到retn指令,等于pop eip,这时会从栈里弹出一个数据放到EIP寄存器里,在这里,因为溢出,栈里的数据都被我们修改了,我们就可以自己任意定义EIP寄存器的值,但是当时我们把返回地址修改为一个固定地址,这里就是Shellcode在内存中的地址,最后让EIP寄存器就会被修改为这个地址,但是在真正的漏洞利用过程中,因为很多原因,Shellcode的地址不是固定的,是动态变化着的,这样我们就不能在程序运行前预知Shellcode的地址,这时我们可以从系统DLL中搜索一句代码“jmp esp”,这里的代码地址一般来说是不会变的,把返回地址改写成“jmp esp”的地址,然后在后面写上我们的Shellcode,这样,执行完retn指令以后EIP就会指向“jmp esp”的地址,然后就会跳去执行“jmp esp”,而堆栈指针-ESP会往下走,这时EIP会指向esp,指向ShellCode的开始,程序继续执行,就正好就跳到我们的Shell Code的地方了。

OD有一个插件叫做OllyUni可以查找内存里的各种指令的地址,这样我们先来看看这样的Shellcode。

我们把这些机器码按照16进制的方式写入“rejector.txt”文件,并且把返回地址对应的位置修改为刚才在OD中查找到的地址“75FF63E8”,保存后,运行一下程序,可以看到,成功弹出一个对话框,这说明我们的溢出代码被执行了!