>> 欢迎您, 傲气雄鹰: 重登陆 | 退出 | 注册 | 资料 | 设置 | 排行 | 新贴 | 精华 | 管理 | 帮助 首页

  小榕软件实验室
  刀光雪影
  主题: 深入浅出谈“缓冲区溢出”攻击  
发表文章 发表涂鸦
  回复数:8  点击数:448 将此页发给您的朋友        
作者 主题: 主题: 深入浅出谈“缓冲区溢出”攻击   回复 | 收藏 | 打印 | 篇末
d0nNy帅哥哦
级别:老 站 友
威望:0
经验:0
货币:19
体力:0.8
来源:好像是三番市
总发帖数:381
注册日期:2002-04-12
查看 邮件 主页 QQ 消息 引用 复制 下载 

主题: 深入浅出谈“缓冲区溢出”攻击  
QQQQ


开国大老
威望:0 发表于 2001-08-11.01:58:50            
--------------------------------------------------------------------------------

缓冲区溢出”是黑客谈论最多的话题之一,我也是一个hack初学者,以前用过sunx的iis5hacker,idahack,后来是snake的IISIDQOverflowV2_Build0016.exe,我相信大部分看这遍文章的人都用过,但倒底这些程序做了什么呢?
这篇文章我会举个实例,让你知道它到底能干什么,然后你就知道“缓冲区溢出”为什么会是当前骇客入侵攻击的主力手法,我想看完后你用“缓冲区溢出”hack起来会心里有底.

不过这篇文章我是假设你已经知道CPU暂存器,懂组合语言,C程序设计,Windows系统运作这些基础(我也刚知道),所以我不再废话讲这些东西,而是直接谈实际的范例,如果你不懂这些基础也没关系,当故事来看,我想你应该也有收获。

首先来看实例的“Buffer Overflow Demo.exe”程序:

#include <windows.h>
#include <stdio.h>
void overflow(char *s,int size)

{
char buffer[80];

s[size]=0;
strcpy(buffer,s);
}

int main ( )

{
FILE *file;
char buf [300];
LoadLibrary( "msvcrt.dll" );
file = fopen("bo.txt.code","rb");
if( file!=NULL )
{
fread(buf,sizeof(char),255,file);
overflow(buf,255);
fclose(file);
}
else
{
puts("open file error");
return 0;
}
}


这是我为了示范“缓冲区溢出”漏洞而写的一个有问题的程序,注意到在函示overflow()里面我只宣告80个字元的缓冲区大小

char buffer[80];

然后主程序main()里面它会读取硬碟内一个名为“bo.txt.code”的档案:

file = fopen("bo.txt.code","rb");

然后把读取档案后的内容传给函示overflow()去执行。

在这你可以看到“bo.txt.code”档案的内容我是读取255个字元:

fread(buf,sizeof(char),255,file);

但是overflow()的缓冲区大小只有80个字元(char buffer[80]),所以这个程序执行后Windows系统会跟我讲程序执行无效,然后将它关闭。

为什么“缓冲区溢出”会当掉,那是因为过长的资料把原本堆叠内暂存器的值覆盖掉,使得应该正常返回程序位址的EIP值变成错误,而导致Windows无法继续执行程序。

所以我设计了一个0~255 ASCII字元内容组成的“bo.txt.code”档案来让“Buffer Overflow Demo.exe”程序执行.


你可看到在“bo.txt.code”档案里面16进位“50 51 52 53”的位置,会变成“Buffer Overflow Demo.exe”程序当掉时EIP的值,下面我将“50 51 52 53”改成“ee ee ee ee”,你会看到果然“Buffer Overflow Demo.exe”程序当掉后EIP就变成“ee ee ee ee”:


好了,暂存器EIP是控制电脑去哪执行程序的一个指标,而发生“缓冲区溢出”时,竟然可以让我们自行指定EIP的值(如前面将“50 51 52 53”改成“ee ee ee ee”),所以如果骇客将入侵程序在发生“缓冲区溢出”时去执行的话,不就可以达到让系统执行“入侵程序”的目的?

现在我写了一个简单的入侵程序,这个程序它的功能很简单,就是要开启一个DOS视窗.


程序如下:

mov esp,ebp
push ebp
mov ebp,esp
xor edi,edi
push edi
sub esp,08h
mov byte ptr[ebp-0ch],63h
mov byte ptr[ebp-0bh],6fh
mov byte ptr[ebp-0ah],6dh
mov byte ptr[ebp-09h],6dh
mov byte ptr[ebp-08h],61h
mov byte ptr[ebp-07h],6eh
mov byte ptr[ebp-06h],64h
mov byte ptr[ebp-05h],2eh
mov byte ptr[ebp-04h],63h
mov byte ptr[ebp-03h],6fh
mov byte ptr[ebp-02h],6dh
lea eax,[ebp-0ch]
push eax
mov eax, 78019824h
call eax


好,我把这段入侵程序机械码涵括在“bo.txt.code”档案里面,然后算准要执行到这段程序码的EIP值是“62 74 06 80”(其实是找系统有 jmp esp-ff e4 的位址),


现在再执行一次这个“Buffer Overflow Demo.exe”程序,


看到了吗?程序竟然没有当掉,而跑去执行我当初入侵程序码的内容,开了一个DOS视窗出来。

各位用过Windows出现类似如下的错误讯息经验有多少?

每个发生类似错误的程序,如果能够找到确实是因为“缓冲区溢出”而出问题的话,全部都能够变成骇客的工具.

===================================================
版权:
本文由7nt所著,版权归7nt所有,转载请保持文章完整性!

----------------------------------------------------------
┏━━━━━━━━━━━━━━━━━━━━┓
┃姓名:d0nNy ┌───┐┃
┃出 生 地:香港│ 照 │┃
┃持牌类型:灌水执照││┃
┃注:1.持此照可在任何地区灌水。│ 片 │┃
┃2.此执照仅限本人使用不得转让。└───┘┃
┗━━━━━━━━━━━━━━━━━━━━┛

编辑 删除 发表时间发表于 2002-04-16.21:05:46   MSIE 6.0 Windows 2000IP: 已记录
司马青衫帅哥哦
级别:一般站友
威望:0
经验:0
货币:176
体力:32.7
来源:安徽
总发帖数:23
注册日期:2002-04-16
查看 邮件 主页 QQ 消息 引用 复制 下载 

在下拜读了,很开眼界.希望大侠留个QQ,以后好向大侠讨教.

编辑 删除 发表时间发表于 2002-04-17.21:21:22   MSIE 5.0 Windows 98IP: 已记录
d0nNy帅哥哦
级别:老 站 友
威望:0
经验:0
货币:19
体力:0.8
来源:好像是三番市
总发帖数:381
注册日期:2002-04-12
查看 邮件 主页 QQ 消息 引用 复制 下载 

找7nt去吧,阿嘎嘎
----------------------------------------------------------
┏━━━━━━━━━━━━━━━━━━━━┓
┃姓名:d0nNy ┌───┐┃
┃出 生 地:香港│ 照 │┃
┃持牌类型:灌水执照││┃
┃注:1.持此照可在任何地区灌水。│ 片 │┃
┃2.此执照仅限本人使用不得转让。└───┘┃
┗━━━━━━━━━━━━━━━━━━━━┛

编辑 删除 发表时间发表于 2002-04-17.21:24:11   MSIE 6.0 Windows 2000IP: 已记录
司马青衫帅哥哦
级别:一般站友
威望:0
经验:0
货币:176
体力:32.7
来源:安徽
总发帖数:23
注册日期:2002-04-16
查看 邮件 主页 QQ 消息 引用 复制 下载 

在下想结交阁下,呵,能给个机会吗

编辑 删除 发表时间发表于 2002-04-17.21:36:50   MSIE 5.0 Windows 98IP: 已记录
d0nNy帅哥哦
级别:老 站 友
威望:0
经验:0
货币:19
体力:0.8
来源:好像是三番市
总发帖数:381
注册日期:2002-04-12
查看 邮件 主页 QQ 消息 引用 复制 下载 

呵呵,其实我已经说过了。^_^
----------------------------------------------------------
┏━━━━━━━━━━━━━━━━━━━━┓
┃姓名:d0nNy ┌───┐┃
┃出 生 地:香港│ 照 │┃
┃持牌类型:灌水执照││┃
┃注:1.持此照可在任何地区灌水。│ 片 │┃
┃2.此执照仅限本人使用不得转让。└───┘┃
┗━━━━━━━━━━━━━━━━━━━━┛

编辑 删除 发表时间发表于 2002-04-17.21:39:14   MSIE 6.0 Windows 2000IP: 已记录
司马青衫帅哥哦
级别:一般站友
威望:0
经验:0
货币:176
体力:32.7
来源:安徽
总发帖数:23
注册日期:2002-04-16
查看 邮件 主页 QQ 消息 引用 复制 下载 

在下愚笨,没有看出来

编辑 删除 发表时间发表于 2002-04-17.21:44:14   MSIE 5.0 Windows 98IP: 已记录
司马青衫帅哥哦
级别:一般站友
威望:0
经验:0
货币:176
体力:32.7
来源:安徽
总发帖数:23
注册日期:2002-04-16
查看 邮件 主页 QQ 消息 引用 复制 下载 

呵呵,居然把这篇精了,呵呵,留个QQ啊

编辑 删除 发表时间发表于 2002-04-18.22:07:33   MSIE 5.0 Windows 98IP: 已记录
笨鸟不会黑帅哥哦
级别:高级站友
威望:0
经验:0
货币:418
体力:45.6
来源:新疆
总发帖数:114
注册日期:2002-01-22
查看 邮件 主页 QQ 消息 引用 复制 下载 

好文章哦 可惜我不大看的懂

编辑 删除 发表时间发表于 2002-04-19.04:11:30   MSIE 5.0 Windows 98IP: 已记录
M.Bison帅哥哦
级别:新手上路
威望:0
经验:0
货币:
体力:
来源:61.236.128.*
总发帖数:8
注册日期:2002-02-18
查看 邮件 主页 QQ 消息 引用 复制 下载 

x86的处理器在执行函数(就是汇编代码call ***)时,会把函数参数和当前
CS,IP(32位处理器是EIP)压入栈,然后跳转到函数代码处执行,函数执行完后
ret指令出栈,取出(E)IP,CS,继续执行
char buffer[80]; 就是在当前堆栈里开一个80的buffer。由于char buffer[80]; 语句是紧跟着调用函数的,所以堆栈状态如下
高字节int size(4 byte
char *s(4 byte)
CS (2 byte)
EIP (4 byte)
{buffer[80
80byte
{
低字节

可见,当strcpy时,超过80字节后的字节就写到保存EIP的栈里里了,当函数
执行完后,应用程序要从堆栈里取出CS和EIP的值(否则程序执行完函数后怎么回得到原来的地址继续执行)

编辑 删除 发表时间发表于 2002-05-02.11:45:59   MSIE 4.01 Windows 98IP: 已记录
选择回复        
 快速回复主题: >>>高级模式
  用户名: 没有注册? 密码: 忘记密码?
记住密码
HTML语法
禁止IDB代码
禁止表情字符

[按 Ctrl+Enter 快捷键可直接提交帖子]
 投票评分: 共 0 票  
所有时间均为: 北京时间 ↑TOP 
关闭主题 拉前主题 移动主题 主题置顶 取消置顶 总固顶主题 取消总固顶 加入精华 移出精华 删除主题