Linux和Windows堆栈溢出利用对比

堆栈溢出的利用,有三大条件,一是返回点的定位,二是ShellCode的编写,三是跳转到ShellCode。

1.返回点的定位

在Windows下,F.ZH的在它经典的《菜鸟版Exploit编写指南之一》的文章中,详细的讲述了利用报错对话框精确定位溢出返回点的方法。
Windows下弹出报错对话框,显示“0x74737271”指令引用“0x74737271”内存,该地址不能为“read”。

里面隐含的意思就是返回点EIP被覆盖成了“0x74737271”,去执行的时候该地址是不能读的,就有错误了。“0x74737271”是什么呢?前面说了,就是字符串“qrst”,离我们填充的第一个字符“a”正好距离是“q”–“a”=0x71 – 0x61=0x10=16,所以在报错对话框的帮助下,我们可以轻松的知道,在覆盖了16个字符之后,就到达返回点的位置了。

在知道了返回点EIP的位置后,我们就可以覆盖返回点为任意值,让程序运行到一个错误的地方,从而出现报错提示。那如果我们特意把EIP覆盖成我们想去的程序的地方呢?当然就可以运行我们想要的程序了,而一般的,我们想要的程序称为ShellCode!看到胜利的曙光了吧?!

2.ShellCode的编写方法

Shell最先指人机交互的界面,而这里Shellcode不仅仅指交互,它还指可以实现任意功能的代码,可以涉及到很多方面。我们想要的程序功能最好是能够开一个DOS窗口,那我们可以做很多事情了。

在Windows下,开DOS窗口的程序如下:

#include<Windows.h>
int main()
{
    LoadLibrary(“msvcrt.dll”);
    system(“command.com”);
    return 0;
}

Windows下执行一个Command.com就可以获得一个DOS窗口,在C库函数里面,语句System(“command.com”);将完成我们需要的功能。Windows是通过动态链接库DLL来提供系统函数的。System函数由Msvcrt.dll(The Microsoft VIsual C++ Runtime library)提供,所以要想执行System,我们必须首先使用LoadLibrary(“msvcrt.dll”);装载动态链接库,svcrt.dll之后才能调用System函数。
我们执行上面的代码,看看效果吧:弹出来了一个DOS对话框!可以执行DIR,COPY等任意DOS命令。

我们要得到机器码形式的ShellCode,可以在VC中按F10调试,然后在Debug工具栏中,点最后一个按钮Disassemble,这样出现了源程序的汇编代码,再在代

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值