C语言如何执行buf中的代码

时间:2024-10-21 16:09:11

1、我们至少可以做的是避免编写不好的代码,从而有机会甚至脚本小孩攻击你的程序并利用它在这个缓冲区溢出教程中,我们将讨论以下的基础知识:什么是缓冲区溢出?如何发生缓冲区溢出?如何发生缓冲区溢出攻击?如何避免缓冲区溢出?我们会保留解释和示例,使您完全了解这一概念。我们还将使用C编程语言来解释缓冲区溢出概念。

2、什么是缓冲区溢出?在执行程序方面,缓冲区可以被认为是计算机主存储器的一个区域,它与引用此内存的程序变量在上下文中具有一定的界限。例如 :char buff [10]

3、在上面的例子中,“buff”表示10个字节的数组,其中buff [0]是左边界,buff [9]是缓冲区的右边界。让我们举个例子:int arr [10]

4、在上面的例子中,'arr'表示10个整数的数组。现在假设整数的大小是4字节,“arr”的总缓冲区大小是10 * 4 = 40字节。与第一个例子类似,arr [0]指的是左边界,洹彭岣啬而arr [9]是指右边界。现在应该清楚一个缓冲区是什么意思。继续前进让我们了解缓冲区溢出时。当数据(意图写入存储器缓冲器)被写入缓冲器的左边界或右边界时,缓冲器被称为溢出。这样,数据将被写入到不属于引用缓冲区的程序变量的内存的一部分。这是一个例子:char buff [10];buff [10] ='a';

5、在上面的例子中,我们声明了一个大小为10字节的数组。请注意,索引0到索引9可以用于指代这10个字节的缓冲区。但是,在下一行中,我们的索引10用于存储值“a”。这是缓冲区溢出发生的原因,因为数据写入超出缓冲区的右边界。

6、为什么缓冲区溢出有害?我们中的一些人可能会认为,尽管缓冲区溢出是一个糟糕的编程习惯,但堆栈上的一个未使用的变量也是如此,那么为什么这么多的hullabaloo呢?什么是缓冲区超载可能对应用程序造成的影响?那么,如果在一行中我们必须总结这些问题的答案,那就是:缓冲区溢出(如果未检测到)可能导致程序崩溃或产生意外结果。让我们了解上面提到的几个解决方案的几个场景。

7、考虑在堆内存中分配10个字节的情况:char * ptr =(char *)malloc(10);

8、现在,如果你尝试这样做:ptr [10] ='c';那么这可能导致大多数情况下崩溃。原因是,指针不允许访问不属于它的堆内存。

9、考虑另一种情况,您尝试填补缓冲区(堆栈)超出容量:char buff [10] = {0};strcpy(buff, "This String Will Overflow the Buffer");

10、正如你可以看到,strcpy()函数将在数组“buff”中写入完整的字符言射鐾钤串,但是由于“buff”的大小蟛杆戛攉小于字符串的大小,所以数据将被写入数组“buff”的右边界'。现在,根据您使用的编译器,很有可能在编译期间不会被忽视,并且在执行过程中不会崩溃。简单的原因是堆栈内存属于程序,所以这个内存中的任何缓冲区溢出可能会被忽视。所以在这种情况下,缓冲区溢出会静静地破坏相邻的内存,如果程序使用了损坏的内存,那么可能会导致意想不到的结果。

11、缓冲区溢出攻击到目前为止,我们讨论了什么缓冲区溢出可以对您的程序做。由于缓冲区溢出,我们了解了程序如何崩溃或发生意外的结果。恐怖不是吗?但是,这不是最糟糕的一部分。

12、当攻击者了解您的程序中的缓冲区缓冲区时,它会变得更糟,他/她利用它。困惑?考虑这个例子:

C语言如何执行buf中的代码

13、上面的程序模拟程序期望来自用户的密码的情况,如果密码正确,则向用户授予root权限。让我们用正确的密码运行程序,即'thegeekstuff':$ ./bfrovrflw Enter the password :thegeekstuff Correct Password Root privileges given to the user

14、这样可以预期。密码匹洧粽袄淖配和root权限给出。但是你知道这个程序有可能出现缓冲区溢出。gets()函数不检查数组边界,甚至可以写入长度大于写入字符串的缓冲区大小的字符串。现在,你甚至可以想象这邗锒凳审个漏洞可以攻击者能做什么?这是一个例子:$ ./bfrovrflwEnter the password :hhhhhhhhhhhhhhhhhhhh Wrong Password Root privileges given to the user

15、在上面的例子中,即使输入了错误的密码,程序就像你给出正确的密码一样工作。上面的输出有一个逻辑。攻击者做的是,他/她提供了一个长度大于可以保存的缓冲区的输入,并且在缓冲区溢出的特定长度的输入处,它覆盖了整数'pass'的内存。所以尽管密码错误,'pass'的值变为非零,因此授予攻击者root权限。还有其他几种高级技术(如代码注入和执行),通过这种技术可以完成对流程攻击的缓冲区,但首先了解缓冲区的基础知识总是重要的,它是溢出的,为什么它是有害的。

16、如果想在linux下学习C的,可以参考《linux就该这么学》这本教程先学习下基础的SHELL,在学习gcc,对你会有很大的帮助,也可以网上找找其它的学习资料,这样对你会有很大的帮助。

© 手抄报圈