缓冲区溢出攻击示例

A. 缓冲器 是数据存储的临时区域。当程序或系统进程放置的数据(比最初分配给存储的数据多)越多时,多余的数据就会溢出。它会导致一些数据泄漏到其他缓冲区,从而损坏或覆盖它们所持有的任何数据。 在一个 缓冲区溢出攻击, 额外的数据有时包含黑客或恶意用户意图采取的行动的具体说明;例如,这些数据可能会触发破坏文件、更改数据或公开私人信息的响应。 攻击者会利用缓冲区溢出漏洞利用等待用户输入的程序。缓冲区溢出有两种类型:基于堆栈的和基于堆的。基于堆(Heap-based)的方法很难执行,也是这两种方法中最不常见的一种,它通过溢出为程序保留的内存空间来攻击应用程序。基于堆栈的缓冲区溢出在攻击者中更为常见,通过使用堆栈(用于存储用户输入的内存空间)利用应用程序和程序进行攻击。 让我们研究一些真实的程序示例,这些示例基于C。 在示例中,我们没有实现任何恶意代码注入,只是为了表明缓冲区可能会溢出。现代编译器通常在编译/链接时提供溢出检查选项,但在运行时,如果没有任何额外的保护机制(如使用异常处理),则很难检查此问题。

null

C

// A C program to demonstrate buffer overflow
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main( int argc, char *argv[])
{
// Reserve 5 byte of buffer plus the terminating NULL.
// should allocate 8 bytes = 2 double words,
// To overflow, need more than 8 bytes...
char buffer[5]; // If more than 8 characters input
// by user, there will be access
// violation, segmentation fault
// a prompt how to execute the program...
if (argc < 2)
{
printf (" strcpy () NOT executed....");
printf ("Syntax: %s <characters>", argv[0]);
exit (0);
}
// copy the user input to mybuffer, without any
// bound checking a secure version is srtcpy_s()
strcpy (buffer, argv[1]);
printf ("buffer content= %s", buffer);
// you may want to try strcpy_s()
printf (" strcpy () executed...");
return 0;
}


在Linux中编译此程序,并使用命令output_file INPUT进行输出

 Input  : 12345678 (8 bytes), the program run smoothly.
 Input : 123456789 (9 bytes)"Segmentation fault" message will be displayed and the program terminates.

该漏洞的存在是因为如果用户输入(argv[1])大于8字节,缓冲区可能会溢出。为什么是8字节?对于32位(4字节)系统,我们必须填充一个双字(32位)内存。字符(char)大小为1字节,因此如果我们请求5字节的缓冲区,系统将分配2个双字(8字节)。这就是为什么当你输入超过8字节时;mybuffer将溢出 类似的标准函数在技术上不易受攻击,例如strncpy()、strncat()和memcpy()。但这些函数的问题在于,断言缓冲区大小是程序员的责任,而不是编译器的责任。 每个C/C++程序员在编码之前都必须知道缓冲区溢出问题。在大多数情况下,由于缓冲区溢出,会产生很多漏洞。 推荐人 维基百科 缓冲区溢出 c++缓冲区溢出 本文由 阿卡什·沙兰 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享