“普通人不想自由,他只是想安全。” – HL Menken 我正在尝试编写非常安全的C语言。下面我列出一些我使用的技术,并询问它们是否像我想的那样安全。 请不要犹豫,把我的代码/先入之见撕成碎片。 任何答案,即使是最微不足道的漏洞,或教我一个新的想法将受到高度重视 。 从stream中读取: 根据GNU C编程教程 getline: getline函数会根据需要通过realloc函数自动放大内存块,所以永远不会有空间不足 – getline是如此安全的一个原因。 请注意,getline可以安全地处理您的input行,不pipe它多长时间。 我认为getline应该在所有input下防止从stream中读取时发生缓冲区溢出 。 我的假设是否正确? 有没有可能导致利用的input和/或分配scheme? 例如,如果stream中的第一个字符是一些奇怪的控制字符 ,可能是0x08 BACKSPACE(ctl-H)。 有没有工作做mathcertificategetline是安全的? Malloc在失败时返回空值: 如果malloc遇到错误malloc返回一个NULL指针。 由于仍然可以将指针运算应用于NULL(0x0)指针,因此存在安全风险,因此维基百科build议 /* Allocate space for an array with ten elements of type int. */ int *ptr = (int*)malloc(10 * sizeof (int)); if (ptr == NULL) { /* Memory could […]
我只是在VS2010上编译了一些C ++代码片段,并分析了IDA Pro上的可执行文件。 我注意到的是,他们中的大多数在开始时具有类似于以下内容的东西(在调用__security_check_cookie之后不久) xor eax, ebp 和类似的东西 xor ecx, ebp 在底部。 为什么会这样呢? 编译器优化已closures。
编程中堆栈溢出和缓冲区溢出有什么不同?
我一直在打开我的头,找不到一个很好的答案来回答这个问题。 我知道nop sled是一种用于规避缓冲区溢出攻击中堆栈随机化的技术,但我无法理解它是如何工作的。 什么是一个简单的例子来说明这种方法? 128字节的nop sled是什么意思?
我正在做一个家庭作业问题 ,需要禁用编译器优化保护才能正常工作。 我在Ubuntu的Linux上使用gcc 4.4.1,但不知道哪个标志是正确的。 我意识到这是依赖于架构 – 我的机器运行W / 32位英特尔处理器。 谢谢。
int func(char* str) { char buffer[100]; unsigned short len = strlen(str); if(len >= 100) { return (-1); } strncpy(buffer,str,strlen(str)); return 0; } 这段代码容易受到缓冲区溢出攻击,我试图找出原因。 我认为这与len被声明为short而不是int ,但是我不确定。 有任何想法吗?
我最近开始学习C,我正在以C为主题的课。 我目前正在玩循环,我遇到了一些奇怪的行为,我不知道如何解释。 #include <stdio.h> int main() { int array[10],i; for (i = 0; i <=10 ; i++) { array[i]=0; /*code should never terminate*/ printf("test \n"); } printf("%d \n", sizeof(array)/sizeof(int)); return 0; } 在我的笔记本电脑上运行Ubuntu 14.04,这个代码不会中断。 它运行完成。 在我学校的电脑上运行CentOS 6.6,它也运行良好。 在Windows 8.1上,循环永远不会终止。 更奇怪的是,当我将for循环的条件编辑为: i <= 11 ,代码仅在运行Ubuntu的笔记本电脑上终止。 它永远不会终止在CentOS和Windows。 任何人都可以解释内存中发生了什么,以及为什么不同的操作系统运行相同的代码会产生不同的结果? 编辑:我知道for循环超出界限。 我正在故意的 我只是无法弄清楚在不同的操作系统和计算机上,行为是如何不同的。
Java有缓冲区溢出吗? 如果是,你可以给我的scheme吗?
编辑:我已经添加了该示例的源代码。 我遇到这个例子 : char source[MAX] = "123456789"; char source1[MAX] = "123456789"; char destination[MAX] = "abcdefg"; char destination1[MAX] = "abcdefg"; char *return_string; int index = 5; /* This is how strcpy works */ printf("destination is originally = '%s'\n", destination); return_string = strcpy(destination, source); printf("after strcpy, dest becomes '%s'\n\n", destination); /* This is how strncpy works */ […]