http网站DDoS高防谨防-墨者安全-墨者盾
DDOS防御_CC防护_高防CDN服务器_【墨者安全】—墨者盾墨者盾—你的网站贴身保镖!

QQ:800185041
高防免费接入:400-0797-119

渠道合作:156 2527 6999

主页 > CC防火墙 > http网站DDoS高防谨防

http网站DDoS高防谨防

小墨安全管家 2021-01-14 10:17 CC防火墙 89 ℃
DDoS防御

http网站谨防_能不能防_日本cc防护

啥是缓冲区溢出攻击?基于堆栈的缓冲区溢出攻击大概是远程接管进程的代码执行的最闪亮和最常见的攻击形式。这些漏洞攻击在20年前极为常见,但从那时起,操作系统开辟人员、应用程序开辟人员和硬件创造商为缓解基于堆栈的溢出攻击付出了大量努力,甚至对开辟人员使用的标准库举行了更改。下面,DDoS防御,我们将探讨基于堆栈的溢出是怎么工作的,并详细讲明为防止这些溢出而采取的缓解策略。深入研究基于堆栈的缓冲区溢出攻击理解基于堆栈的溢出攻击至少需要对计算机内存有一具差不多的了解。计算机中的存储器不过一具存储数据和指令的地点,用于存储数字、字母、图像和其他任何东西的数据,以及指示计算机怎么处理这些数据的指令。两者都存储在同一具内存中,因为在早期的计算中,内存很昂贵,而将其保留为某种类型的存储是白费。这种将数据和指令存储在一起的想法称为Von Neumann体系结构。时至今日,它仍在大多数计算机中使用,只是正如你将看到的,它并非没有复杂性。好的一面是,在早期的计算机和软件设计中,安全并不是驱动因素,工程师们意识到改变内存中的运行指令是个坏主意,于是早在90年代,标准的硬件和操作系统就在防止改变指令经历方面做得特别好。不幸的是,你并不需要经过改变指令来改变正在运行的程序的行为,而且只要掌握一点知识,可写数据内存就提供了几种阻碍指令执行的机遇和想法。举个非常做作的例子:#包括#包括#包括内部主(){字符realPassword[20];字符给定密码[20];strncpy(realPassword,"dddddddddddd",20);猎取(givenPassword);if(0==strncmp(给定密码,realPassword,20)){printf("成功!\n");}其他{printf("失败!\n");}升高(SIGINT);printf("给定密码:%s\n",givenPassword);printf("realPassword:%s\n",realPassword);返回0;}假如你不明晓C编程语言,那没关系。那个程序的有味之处在于它在内存中创建了两个名为realPassword的缓冲区,并将npassword作为局部变量。每个缓冲区有20个字符的空间。当我们运行程序时,这些局部变量的空间是在内存中创建的,并与所有其他局部变量(以及其他一些东西)一起特意存储在堆栈中。堆栈是一具很结构化的、延续的内存空间,所以内存中任意两个局部变量之间的相对距离能够保证相对较小。在那个程序创建变量之后,它用一具字符串填充realPassword值,接着提示用户输入密码,并将提供的密码复制到给定的password值中。一旦它有了两个密码,它就会比较它们。假如它们匹配,就会打印"成功!"假如没有,它会打印"失败!"下面是一具运行示例:msfuser@ubuntu:~$ ./示例.elf测试失败!givenPassword:测试真实密码:dddddddddddddd这正是我们所期望的。我们输入的密码与预期密码不匹配。那个地点有一具陷阱:程序员(我)犯了几个很严峻的错误,我们稍后再讨论。在讨论之前,让我们打开一具调试器并查看内存,看看程序执行时,堆栈在内存中的模样:msfuser@ubuntu:~$gdb公司示例.elf...(gdb)运行启动程序:/home/msfuser/示例.elfaaaaaaaaaaaaaa失败!程序接收到信号SIGINT,中断。0x00007ffff7a42428,在../sysdeps/unix/sysv/linux/raise.c:54处的\uu GI_raise(sig=2)54../sysdeps/unix/sysv/linux/raise.c:没有如此的文件或名目。(gdb)在这一点上,程序基本接收了数据并举行了比较,然而我在代码中添加了一具中断,以便在退出之前停止它,如此我们就能够"查看"堆栈了。调试器让我们看到程序在做啥,以及运行时内存的模样。在本例中,我们使用的是GNU调试器(GDB)。GDB命令'info frame'允许我们寻找局部变量在内存中的位置,这些变量将位于堆栈上:(gdb)信息帧堆栈级别0,帧位于0x7fffffffdde0:rip=0x7ffff7a42428 in\uugi_raise(../sysdeps/unix/sysv/linux/raise.c:54);保存的rip=0x400701帧在0x7fffffffde30调用源语言c。Arglist位于0x7fffffffddd0,args:sig=2局部变量为0x7fffffffddd0,上一帧的sp为0x7fffffffdde0保存的寄存器:在0x7fffffffddd8处撕开(gdb)既然我们懂了局部变量的位置,我们就能够打印该内存区域:(gdb)x/200x 0x7FFFFFDDD00x7fffffffddd0:0x00000000 0x00000000 0x00400701 0x000000000x7fffffffdde0:0x61616161 0x61616161 0x616161 0x6161610x7fffffffddf0:0x00000000 0x00000000 0x00000000 0x000000000x7fffffffde00:0x64646464 0x646464 0x646464 0x006464640x7fffffffde10:0x00000000 0x00007fff 0x00000000 0x00000000...如前所述,堆栈是按顺序存储的数据。假如您懂ASCII,这么您就懂字母'a'在内存中由值0x61表示,字母'd'是0x64。你能够在上面看到,它们在经历中是挨着的。realPassword缓冲区就在给定密码缓冲区之后。如今,让我们谈谈程序员(我)犯的错误。首先,开辟人员永久都不应该使用gets函数,因为它不大概检查以确保它读取的数据大小与它用来保存数据的内存位置的大小匹配。它不过盲目地阅读文本并将其转储到内存中。有特别多函数都做同样的情况,这些函数被称为无界函数,因为开辟人员无法预测何时会停止对内存的读写操作。微软甚至有一具网页记录了它称之为"禁止"的函数,其中包括这些无限函数。每个开辟人员都应该懂并幸免使用这些函数,DDoS防御,每个项目都应该自动审核它们的源代码。这些职能都源于一具阶段,当时的安全并不像今天这么迫切。这些功能必须然后得到支持,因为拉式支持会破坏很多旧程序,但不应在任何新程序中使用它们,而应在维护旧程序时删除它们。看看黑客我们查看了堆栈,注意到缓冲区在内存中是延续的,并讨论了为啥gets是一具坏函数。如今让我们来看看我们能不能破解星球打算。既然我们懂gets在读取超过它应该读取的数据方面存在咨询题,这么首先要尝试给它提供比缓冲区所能容纳的更多的数据。缓冲区是20个字符,于是让我们从30个字符开始:msfuser@ubuntu:~$gdb公司示例.elf...(gdb)运行启动程序:/home/msfuser/示例.elf啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊失败!给定密码:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa真实密码:dddddddddddddd程序接收到信号SIGINT,中断。0x00007ffff7a42428,在../sysdeps/unix/sysv/linux/raise.c:54处的\uu GI_raise(sig=2)54../sysdeps/unix/sysv/linux/raise.c:没有如此的文件或名目。(gdb)信息帧堆栈级别0,帧位于0x7fffffffdde0:rip=0x7ffff7a42428 in\uugi_raise(../sysdeps/unix/sysv/linux/raise.c:54);保存的rip=0x40072d帧在0x7fffffffde30调用源语言c。Arglist位于0x7fffffffddd0,args:sig=2局部变量为0x7fffffffddd0,上一帧的sp为0x7fffffffdde0保存的寄存器:在0x7fffffffddd8处撕开(gdb)x/200x 0x7FFFFFDDD00x7fffffffddd0:0x00000000 0x00000000 0x0040072d 0x000000000x7fffffffdde0:0x61616161 0x61616161 0x616161 0x6161610x7fffffffddf0:0x61616161 0x61616161 0x616161 0x000061610x7fffffffde00:0x64646464 0x646464 0x646464 0x006464640x7fffffffde10:0x00000000 0x00007fff 0x00000000 0x000000000x7fffffffde20:0x00400740 0x00000000 0xf7a2d830 0x00007fff0x7fffffffde30:0x00000000 0x00000000 0xffffdf08 0x00007fff我们能够清晰地看到内存中有30个"a"实例,虽然我们只指定了20个字符的空间。我们基本溢出缓冲区,CC防御,但还不够做任何情况。让我们然后尝试40个'a.'实例msfuser@ubuntu:~$gdb公司示例.elf...(gdb)运行启动程序:/home/msfuser/示例.elf啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊失败!给定密码:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa真实密码:aaaaaaaa程序接收到信号SIGINT,中断。0x00007ffff7a42428,在../sysdeps/unix/sysv/linux/raise.c:54处的\uu GI_raise(sig=2)54../sysdeps/unix/sysv/linux/raise.c:没有如此的文件或名目。...(gdb)x/200x 0x7FFFFFDDD00x7fffffffddd0:0x00000000 0x00000000 0x0040072d 0x000000000x7fffffffdde0:0x61616161 0x61616161 0x616161 0x6161610x7fffffffddf0:0x61616161 0x61616161 0x61616161 0x6161610x7fffffffde00:0x61616161 0x61616161 0x64646400 0x006464640x7fffffffde10:0x00000000 0x00007fff 0x00000000 0x000000000x7fffffffde20:0x00400740 0x00000000 0xf7a2d830 0x00007fff首先要注意的是,我们基本经过了为givenPassword分配的空间,CC防御,并成功地修改了realPassword的值,这是一具巨大的成功。只是,我们并没有修改到脚以愚弄程序。因为我们比较了20个字符,我们将8个字符写入realPassword缓冲区,于是我们需要再写12个字符。于是,让我们再试一次,然而这次有52个"a"实例:msfuser@ubuntu:~$gdb公司示例.elf...(gdb)运行启动程序:/home/msfuser/示例.elf啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊成功!给定密码:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa真实密码:aaaaaaaaaaaaaaaaaa程序接收到信号SIGINT,中断。0x00007ffff7a42428,在../sysdeps/unix/sysv/linux/raise.c:54处的\uu GI_raise(sig=2)54../sysdeps/unix/sysv/linux/raise.c:没有如此的文件或名目。(gdb)信息框架


DDoS防御

当前位置:主页 > CC防火墙 > http网站DDoS高防谨防

标签列表
DDoS防御
网站分类
X
 

QQ客服

400-0797-119