每个体面的C程序员都应该了解/知道的一些概念/技术/语言功能(不包括通用软件工程和类似软件,仅专注于C特定的东西)。我想知道,以便我能够填补我的C知识中的某些空白。
2 + 2 = 4
每个体面的C程序员都应该了解/知道的一些概念/技术/语言功能(不包括通用软件工程和类似软件,仅专注于C特定的东西)。我想知道,以便我能够填补我的C知识中的某些空白。
2 + 2 = 4
Answers:
特定于C?除了大多数过程语言通用的标准构造之外,我还必须说:
我在对毕达格拉斯的回答的评论中提到“缓冲区溢出”,我可能应该澄清一下我的意思。在C语言中,这是不够的,知道这直接与内存的工作是危险的-你也应该明白的精确方法,使这是危险的。在所有这些情况下,我都不太喜欢用“朝自己开枪”的比喻-很多时候,不是您拉动触发器,而是常常是与您和/或用户的利益背道而驰的演员。
例如,在具有递减堆栈的体系结构中(最流行的体系结构符合此要求-通常包括x86和ARM),当您调用函数时,该函数的返回地址将被放置在栈中定义的局部变量之后。函数的主体。因此,如果您将缓冲区声明为局部变量,并在不检查缓冲区溢出的情况下将该变量暴露给外部世界,例如:
void myFn(void) {
char buf[256];
gets(buf);
}
外部用户可以向您发送一个字符串,该字符串将覆盖堆栈中的返回地址-基本上,他可以更改程序的调用图(导致当前函数)的运行时概念。因此,用户为您提供了一个字符串,该字符串是针对您的体系结构的一些可执行代码的二进制表示形式,具有足够的填充量,从而使溢出了堆栈myFn
,还有一些其他数据可以覆盖返回地址myFn
以指向他给您的代码。如果发生这种情况,则myFn
通常在将控制权交还给其调用者时,它将分支到恶意用户提供的代码。如果编写的C(或C ++)代码有可能暴露给不受信任的用户,则需要了解此攻击媒介。您应该了解为什么堆栈中的缓冲区溢出比堆栈中的缓冲区溢出经常(但并非总是)更容易被利用,并且您应该了解堆栈中的内存的布局方式(不一定要太详细,但是malloc()
ed区域周围具有控制结构的想法可以帮助理解为什么您的程序在另一个malloc()
(或free()
)中崩溃。
C为您提供了有关计算机工作方式的低级详细信息,它使您可以比当今广泛使用的任何其他用户编辑语言更直接地控制计算机。强大的能力伴随着巨大的责任-您实际上需要了解那些低级细节,才能安全有效地使用C。