本文目录一览:
- 1、系统在此应用程系统在此应用程序中检测到基于堆栈的缓冲区溢出溢出可能允许恶意用户获得此应用程序的控制?
- 2、打开电脑网页会弹出“堆栈溢出”,这是什么问题,怎么解决?求大神解答,谢了!
- 3、缓充区溢出是怎么回事,黑客是如何利用它入侵个人电脑的?
- 4、系统在此应用程序中检测到基于堆栈的缓冲区溢出。溢出可能允许恶意用户获得此应用程序的控制吗?
- 5、系统在此应用程序中检测到基于堆栈的缓冲区溢出。溢出...
系统在此应用程系统在此应用程序中检测到基于堆栈的缓冲区溢出溢出可能允许恶意用户获得此应用程序的控制?
有溢出漏洞的话,有可能被病毒提权或者进行高权限修改,他这个只是个警告。原因如下:这是启动画面,文件被损坏,或者修改,也有可能丢失,从正常的机里复制logonui.exe 文件u盘。
解决 *** :
1、 用光盘或u盘进入pe把那个文件复制到c:\windows\system32\dllcache和c:\windows\system32下面。
2、如果已存在就替换了,重新开机即可。
缓冲区溢出原理
缓冲区是一块连续的计算机内存区域,可保存相同数据类型的多个实例。缓冲区可以是堆栈(自动变量)、堆(动态内存)和静态数据区(全局或静态)。在C/C++语言中,通常使用字符数组和malloc/new之类内存分配函数实现缓冲区。溢出指数据被添加到分配给该缓冲区的内存块之外。
缓冲区溢出是最常见的程序缺陷。
栈帧结构的引入为高级语言中实现函数或过程调用提供直接的硬件支持,但由于将函数返回地址这样的重要数据保存在程序员可见的堆栈中,因此也给系统安全带来隐患。若将函数返回地址修改为指向一段精心安排的恶意代码,则可达到危害系统安全的目的。
此外,堆栈的正确恢复依赖于压栈的EBP值的正确性,但EBP域邻近局部变量,若编程中有意无意地通过局部变量的地址偏移窜改EBP值,则程序的行为将变得非常危险。
由于C/C++语言没有数组越界检查机制,当向局部数组缓冲区里写入的数据超过为其分配的大小时,就会发生缓冲区溢出。攻击者可利用缓冲区溢出来窜改进程运行时栈,从而改变程序正常流向,轻则导致程序崩溃,重则系统特权被窃取。
若将长度为16字节的字符串赋给acArrBuf数组,则系统会从acArrBuf[0]开始向高地址填充栈空间,导致覆盖EBP值和函数返回地址。若攻击者用一个有意义的地址(否则会出现段错误)覆盖返回地址的内容,函数返回时就会去执行该地址处事先安排好的攻击代码。
最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。若该程序有root或suid执行权限,则攻击者就获得一个有root权限的shell,进而可对系统进行任意操作。
除通过使堆栈缓冲区溢出而更改返回地址外,还可改写局部变量(尤其函数指针)以利用缓冲区溢出缺陷。注意,本文描述的堆栈缓冲区溢出不同于广义的“堆栈溢出(Stack OverFlow)”,后者除局部数组越界和内存覆盖外,还可能由于调用层次太多(尤其应注意递归函数)或过大的局部变量所导致。
打开电脑网页会弹出“堆栈溢出”,这是什么问题,怎么解决?求大神解答,谢了!
这就是溢出漏洞
本词条缺少信息栏、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
溢出漏洞是一种计算机程序的可更正性缺陷。溢出漏洞的全名:缓冲区溢出漏洞 因为它是在程序执行的时候在缓冲区执行的错误代码,所以叫缓冲区溢出漏洞。
目录
1简介
2何谓溢出漏洞
▪ 溢出原理
▪ 本地溢出
▪ 远程溢出
3相关资料
▪ 在程序的地址空间里安排适当的代码
▪ 控制程序转移到攻击代码的形式
▪ 植入综合代码和流程控制
1简介编辑
它一般是由于编程人员的疏忽造成的。
具体的讲,溢出漏洞是由于程序中的某个或某些输入函数(使用者输入参数)对所接收数据的边界验证不严密而造成。
根据程序执行中堆栈调用原理,程序对超出边界的部分如果没有经过验证自动去掉,那么超出边界的部分就会覆盖后面的存放程序指针的数据,当执行完上面的代码,程序会自动调用指针所指向地址的命令。
根据这个原理,恶意使用者就可以构造出溢出程序。
2何谓溢出漏洞编辑
溢出原理
其实溢出原理很简单(我以前以为很难理解,太菜了,o(∩_∩)o…)。当然,这里为了让大家容易理解,会引用一些程序实例(如果没有编程基础的,可以略过程序不看,影响不大,还是能理解的),而且说得会比较通俗和简单,不会太深入。
从书上找来找去,终于找到一个适合的程序(汗!要找符合的程序简单啊,但是要找特级菜鸟觉得特别简单的程序就不多了,55~~)。大家看看下面这段程序:
#include “stdafx.h”
#include “string.h”
#include “stdio.h”
char buf[255],pass[4]; /*声明变量,让计算机分配指定的内存*/
int main (int argc,char* argv[ ])
{
printf(“请输入您的密码:”); /*指定输出的字符*/
scanf(%s,buf); /*输入一个字符串,保存在变量buf中*/
strcpy(pass,buf); /*把字符串buf中的字符串复制到变量pass中*/
if (strcmp(pass,”wlqs”)= =0) /*比较输入的字符串是否为密码*/
printf (“输入正确!”);
else printf(“输入错误!);
return 0;
}
(注:“/*”中的中文是对程序的注解)
这是一段密码验证程序,与我们平时输入密码一样,先让用户输入密码,然后在取得真正的密码,与之对比,如果差异为0,则输出密码正确,否则输出密码错误。很多帐号登录的程序都是这样做的,看起来没有非常合理,其实不然,它有一个致命缺陷!这个漏洞很容易就看出来了。那就是它给数据申请了4个字节的储存空间,但是万一用户输入的数据不只4个字节,那么剩余的字节存放在哪里?
先举个例子,有一条一米长的木头,有一张红色纸条从尾巴往头贴,上面写有字,然后又有一张蓝色纸条,上面也写有字,要从木头的头往它的尾巴贴,但是贴了红色纸条过后只剩4cm的长度,贴完后会有人读出后面96cm的字,并且执行字条的命令,但是蓝色纸条却有10cm的长度,怎么办呢?只有把蓝色纸条剩下的部分贴在红色纸条上了。那么红色纸条的一些字就被覆盖了。但是那个人还是会去读那后面96cm的字,所以他就只有读错,前面读的都是蓝色字条的字。先前去执行的是蓝色字条后面6cm的命令。
当然大家看了这个例子也不是很懂,下面来注解一下:
人——CPU
红色字条上的字——CPU要执行的命令
4cm的长度——计算机为数据申请的内存空间
蓝色字条上的字——要储存的数据
可以看见蓝色字条已经覆盖了红色字条上的字,然而那个人还是必须读出后面96cm的字并执行。后面已经不是规定的命令了!他根本就不能执行,根本读不懂!那么他就不能执行了,并且报错。
如图系统只为我的密码分配4个字节的内存,那么我输入的密码是“714718366”循环了6次的,不只4个字节吧,其他剩下的字符将溢出!剩下的数字将占用内存空间,那么系统执行命令的时候将会执行占用内存的数据,而不是执行原先写好的命令了!这些数字系统根本就读不懂,如何执行?那么它只好报错了!说此程序遇到问题需要关闭。那么计算机上的程序将出错而无法执行或关闭。
本地溢出
上面所说的本地计算机因数据溢出而关闭程序或无法执行就叫做本地溢出。输入超长的数据已经把计算机要执行的代码覆盖掉了,可是,计算机不会管指令有没有被更改,依旧取原先存放指令的空间里的数据来运行,取到“shujucuole!shujucuole!shujucuole!”这些不合法的溢出数据,它依旧会执行,可是在计算机里这样的指令是非法指令,也就是不符合计算机逻辑的指令,用户执行它的时候就会出错,于是程序就被强行关闭了。
题外话:(想来想去,还是说一说o(∩_∩)o…我的爱好……损人利己的爱好)利用这样的溢出漏洞可以关闭很多程序,比如各学校机房里安装的那些远程教育系统,学生的计算机被教师的计算机所控制是因为学生机上安装有一个学生端程序,教师机可以通过教师端来对学生端进行远程控制,学生端没有退出功能,学生所在的用户组也没有强行结束进程的权限,当学生不想被老师控制的时候,可以打开学生端自带的远程消息功能,在消息里输入很长的数据,比如几百上千句“敢控制我!看我不宰了你!”,然后发送,就可以令学生端程序出错而被系统强行关闭。这招对某些网吧的收费系统也有用的!^_^
远程溢出
再举个列子:
#include “stdafx.h”
#include winsock.h
#pragma comment(lib,”ws2_32”)
int main(int argc,char* argv[ ])
{
char buf[255]=” ”,pass[4]=” ”; //声明变量,让计算机分配内存
//================================================================
//这节的代码功能是初始化 *** 连接
//并侦听1234端口等待连接
//没有编程基础的特级菜鸟可以略过不看
SOCKET sock1,sock2;
struct sockaddr_in addr1;
struct sockaddr_in addr2;
addr1 .sin_addr.s_addr=INADDR_ANY;
addr1 .sin_family=AF_INET;
addr1 .sin_port=htons(1234);
WSADATA * wsadatal=new WSADATA( );
WSAStartup(MAKEWORD(2,2),wsadatal1);
sock1=socket(AF_INET,SOCK_STREAM,0);
bind(sock1,(sockaddr *)addr1,sizeof(struct sockaddr) );
listen(sock1,10);
int iSin=sizeof(struct sockaddr_in);
//=================================================================
if(sock2=accept(sock1,(sockaddr *)addr2,iSin)
{//有用户连接进来
send(sock2,“请输入密码,密码正确,则告诉你我的qq:”,36,0);
//发送提示用户输入密码
if (recv(sock2,buf,255,0))
{//接受用户发送过来的数据并保存在缓冲buf变量里
strcpy (pass,buf);//把缓冲buf变量里的数据复制到pass变量中
if(strcmp(pass,”wlqs”= =0)
//比较pass变量里的数据跟“wlqs”字符串之间的差异是否为0
{//差异为0,则说明两者相等,密码正确
send(sock2,”714718366”,9,0);//发送 *** 号给用户
}
else
{//否则就说明密码错误
send (sock2,”密码错误!”,10,0);
}
}
}
//=================[/ft]关闭 *** 连接并退出=======================
closesocket(sock2);
closesocket(sock1);
return 0;
}
这是一个服务器程序,当有用户连接的时候,它会先发送一句话,提示用户输入登录密码。其实它和前面说的本地溢出例子形似,问题也就处在把数据从缓存复制到内存的那句代码里,如果远程用户输入的密码太长,那么同样出现溢出的现象。那么程序就会出错,服务端将被强行关闭。
比如腾讯公司的即时通讯软件服务端程序就曾被黑客不停地攻击导致服务端崩溃,不能正常提供服务,致使很多用户都不能登陆,及时登陆成功也会在几分钟之内再次掉线,就是因为他们的服务端有这样的漏洞存在,被别人利用了,这给他们以及他们的客户造成了不可估计的损失。
3相关资料编辑
缓冲区溢出漏洞攻击方式
缓冲区溢出漏洞可以使任何一个有黑客技术的人取得机器的控制权甚至是更高权限。一般利用缓冲区溢出漏洞攻击root程序,大都通过执行类似“exec(sh)”的执行代码来获得root 的shell。黑客要达到目的通常要完成两个任务,就是在程序的地址空间里安排适当的代码和通过适当的初始化寄存器和存储器,让程序跳转到安排好的地址空间执行。
在程序的地址空间里安排适当的代码
在程序的地址空间里安排适当的代码往往是相对简单的。如果要攻击的代码在所攻击程序中已经存在了,那么就简单地对代码传递一些参数,然后使程序跳转到目标中就可以完成了。攻击代码要求执行“exec(‘/bin/sh’)”,而在libc库中的代码执行“exec(arg)”,其中的“arg”是个指向字符串的指针参数,只要把传入的参数指针修改指向“/bin/sh”,然后再跳转到libc库中的响应指令序列就可以了。当然,很多时候这个可能性是很小的,那么就得用一种叫“植入法”的方式来完成了。当向要攻击的程序里输入一个字符串时,程序就会把这个字符串放到缓冲区里,这个字符串包含的数据是可以在这个所攻击的目标的硬件平台上运行的指令序列。缓冲区可以设在:堆栈(自动变量)、堆(动态分配的)和静态数据区(初始化或者未初始化的数据)等的任何地方。也可以不必为达到这个目的而溢出任何缓冲区,只要找到足够的空间来放置这些攻击代码就够了。
控制程序转移到攻击代码的形式
缓冲区溢出漏洞攻击都是在寻求改变程序的执行流程,使它跳转到攻击代码,最为基本的就是溢出一个没有检查或者其他漏洞的缓冲区,这样做就会扰乱程序的正常执行次序。通过溢出某缓冲区,可以改写相近程序的空间而直接跳转过系统对身份的验证。原则上来讲攻击时所针对的缓冲区溢出的程序空间可为任意空间。但因不同地方的定位相异,所以也就带出了多种转移方式。
(1)Function Pointers(函数指针)
在程序中,“void (* foo) ( )”声明了个返回值为“void” Function Pointers的变量“foo”。Function Pointers可以用来定位任意地址空间,攻击时只需要在任意空间里的Function Pointers邻近处找到一个能够溢出的缓冲区,然后用溢出来改变Function Pointers。当程序通过Function Pointers调用函数,程序的流程就会实现。
(2)Activation Records(激活记录)
当一个函数调用发生时,堆栈中会留驻一个Activation Records,它包含了函数结束时返回的地址。执行溢出这些自动变量,使这个返回的地址指向攻击代码,再通过改变程序的返回地址。当函数调用结束时,程序就会跳转到事先所设定的地址,而不是原来的地址。这样的溢出方式也是较常见的。
(3)Longjmp buffers(长跳转缓冲区)
在C语言中包含了一个简单的检验/恢复系统,称为“setjmp/longjmp”,意思是在检验点设定“setjmp(buffer)”,用longjmp(buffer)“来恢复检验点。如果攻击时能够进入缓冲区的空间,感觉“longjmp(buffer)”实际上是跳转到攻击的代码。像Function Pointers一样,longjmp缓冲区能够指向任何地方,所以找到一个可供溢出的缓冲区是更先应该做的事情。
植入综合代码和流程控制
常见的溢出缓冲区攻击类是在一个字符串里综合了代码植入和Activation Records。攻击时定位在一个可供溢出的自动变量,然后向程序传递一个很大的字符串,在引发缓冲区溢出改变Activation Records的同时植入代码(权因C在习惯上只为用户和参数开辟很小的缓冲区)。植入代码和缓冲区溢出不一定要一次性完成,可以在一个缓冲区内放置代码(这个时候并不能溢出缓冲区),然后通过溢出另一个缓冲区来转移程序的指针。这样的 *** 一般是用于可供溢出的缓冲区不能放入全部代码时的。如果想使用已经驻留的代码不需要再外部植入的时候,通常必须先把代码做为参数。在libc(熟悉C的朋友应该知道,现在几乎所有的C程序连接都是利用它来连接的)中的一部分代码段会执行“exec(something)”,当中的something就是参数,使用缓冲区溢出改变程序的参数,然后利用另一个缓冲区溢出使程序指针指向libc中的特定的代码段。
程序编写的错误造成 *** 的不安全性也应当受到重视,因为它的不安全性已被缓冲区溢出表现得淋漓尽致了。
缓充区溢出是怎么回事,黑客是如何利用它入侵个人电脑的?
什么是缓冲区溢出
单的说就是程序对接受的输入数据没有进行有效的检测导致错误,后果可能造成程序崩溃或者执行攻击者的命令,详细的资料可以看unsecret.org的漏洞利用栏目 。
缓冲区溢出的概念
堆栈溢出(又称缓冲区溢出)攻击是最常用的黑客技术之一。我们知道,UNIX本身以及其上的许多应用程序都是用C语言编写的,C语言不检查缓冲区的边界。在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区。这称作“堆栈溢出或缓冲溢出”。
一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误。但是,如果输入的数据是经过“黑客”精心设计的,覆盖堆栈的数据恰恰是黑客的入侵程序代码,黑客就获取了程序的控制权。如果该程序恰好是以root运行的,黑客就获得了root权限,然后他就可以编译黑客程序、留下入侵后门等,实施进一步地攻击。按照这种原理进行的黑客入侵就叫做“堆栈溢出攻击”。
为了便于理解,我们不妨打个比方。缓冲区溢出好比是将十磅的糖放进一个只能装五磅的容器里。一旦该容器放满了,余下的部分就溢出在柜台和地板上,弄得一团糟。由于计算机程序的编写者写了一些编码,但是这些编码没有对目的区域或缓冲区——五磅的容器——做适当的检查,看它们是否够大,能否完全装入新的内容——十磅的糖,结果可能造成缓冲区溢出的产生。如果打算被放进新地方的数据不适合,溢得到处都是,该数据也会制造很多麻烦。但是,如果缓冲区仅仅溢出,这只是一个问题。到此时为止,它还没有破坏性。当糖溢出时,柜台被盖住。可以把糖擦掉或用吸尘器吸走,还柜台本来面貌。与之相对的是,当缓冲区溢出时,过剩的信息覆盖的是计算机内存中以前的内容。除非这些被覆盖的内容被保存或能够恢复,否则就会永远丢失。
在丢失的信息里有能够被程序调用的子程序的列表信息,直到缓冲区溢出发生。另外,给那些子程序的信息——参数——也丢失了。这意味着程序不能得到足够的信息从子程序返回,以完成它的任务。就像一个人步行穿过沙漠。如果他依赖于他的足迹走回头路,当沙暴来袭抹去了这些痕迹时,他将迷失在沙漠中。这个问题比程序仅仅迷失方向严重多了。入侵者用精心编写的入侵代码(一种恶意程序)使缓冲区溢出,然后告诉程序依据预设的 *** 处理缓冲区,并且执行。此时的程序已经完全被入侵者操纵了。
入侵者经常改编现有的应用程序运行不同的程序。例如,一个入侵者能启动一个新的程序,发送秘密文件(支票本记录,口令文件,或财产清单)给入侵者的电子邮件。这就好像不仅仅是沙暴吹了脚印,而且后来者也会踩出新的脚印,将我们的迷路者领向不同的地方,他自己一无所知的地方。
缓冲区溢出的处理
你屋子里的门和窗户越少,入侵者进入的方式就越少……
由于缓冲区溢出是一个编程问题,所以只能通过修复被破坏的程序的代码而解决问题。如果你没有源代码,从上面“堆栈溢出攻击”的原理可以看出,要防止此类攻击,我们可以:
1、开放程序时仔细检查溢出情况,不允许数据溢出缓冲区。由于编程和编程语言的原因,这非常困难,而且不适合大量已经在使用的程序;
2、使用检查堆栈溢出的编译器或者在程序中加入某些记号,以便程序运行时确认禁止黑客有意造成的溢出。问题是无法针对已有程序,对新程序来讲,需要修改编译器;
3、经常检查你的操作系统和应用程序提供商的站点,一旦发现他们提供的补丁程序,就马上下载并且应用在系统上,这是更好的 *** 。但是系统管理员总要比攻击者慢一步,如果这个有问题的软件是可选的,甚至是临时的,把它从你的系统中删除。举另外一个例子,你屋子里的门和窗户越少,入侵者进入的方式就越少。
黑客主要先从微软漏洞公布表上或者0days上找到漏洞,再根据漏洞编写溢出程序(好多都自带扫描功能)包括本地提权溢出,远程提权溢出.编好后,先用那个扫描一下有漏洞的主机,然后再用它溢出获得权限,控制目标主机.
系统在此应用程序中检测到基于堆栈的缓冲区溢出。溢出可能允许恶意用户获得此应用程序的控制吗?
系统在此应用程序中检测到基于堆栈的缓冲区溢出。溢出可能允许恶意用户获得此应用程序的控制。
有溢出漏洞的话,有可能被病毒提权或者进行高权限修改,他这个只是个警告。原因如下:这是启动画面,文件被损坏,或者修改,也有可能丢失,从正常的机里复制logonui.exe文件u盘。
经典的堆栈溢出是最容易理解的一种内存破坏漏洞:一个易受攻击的应用程序包含这样一个函数,该函数会在没有验证处于用户控制下的数据的长度的情况下将其写入堆栈。
简介
堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的。堆这个存储区存入的数据,是一种特殊的数据结构。
所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“先进后出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。在内存储器(随机存储器)中开辟一个区域作为堆栈,叫软件堆栈;用寄存器构成的堆栈,叫硬件堆栈。
系统在此应用程序中检测到基于堆栈的缓冲区溢出。溢出...
可能是启动画面文件被损坏或者修改,也有可能丢失,从正常的机里复制logonui。exe 文件u盘。
解决 *** :用光盘或u盘进入pe把那个文件复制到c:\windows\system32\dllcache和c:\windows\system32下面。
如果电脑出现无法启动的现象的话,而只能进去安全模式,那么我们就可以在安全模式下恢复系统, *** 是:进入安全模式之后依次点击“开始→所有程序→附件→系统工具→系统还原”。
系统在此应用程序中检测到基于堆栈的缓冲区溢出。溢出可能允许恶意用户获得此应用程序的控制。遇到此问题的用户,可参照以下的 *** 进行解决。
最近有用户反馈,一键u盘装windows10系统后,电脑开机总是会有一个窗口,显示“svchost.exe应用程序错误”提示信息,然后点击确定,电脑桌面就一片空白,只剩下壁纸。svchost.exe应用程序错误怎么办呢?就此问题,下面小编整理了win10系统Svchost.exe错误的修复方案,现分享给大家。