Tag: 缓冲区溢出

缓冲区溢出未发生

我试过这个示例c代码: int main() { int array[5]; int i; for (i = 0; i <= 255; i++) { array[i] = 10; } } 并使用以下方法编译它 gcc -m32 -o a.out buffer2.c 我的问题是为什么没有Segmentation故障? 我用kali linux 64 vendor_id:GenuineIntel 型号名称:Intel(R)Core(TM)i3 CPU M 350 @ 2.27GHz 架构:x86_64 CPU操作模式:32位,64位 字节顺序:Little Endian 我通过添加以下两行来编辑代码: int main() { int x = 12; int array[5]; int i; […]

如何跳过在C中执行缓冲区溢出的行

我想跳过C中的一行, x=1; 在主要部分中使用bufferoverflow ; 但是,我不知道为什么我不能跳过从4002f4到下一个地址4002fb的地址,尽管我计算7个字节从到 。 我还在Debian和AMD环境中配置了randomniZation和execstack环境的选项,但我仍然得到x=1; 。 这个程序有什么问题? 我用dba来调试堆栈和内存地址: 0x00000000004002ef : callq 0x4002a4 **** **0x00000000004002f4** : movl $0x1,-0x4(%rbp) **0x00000000004002fb** : mov -0x4(%rbp),%esi 0x00000000004002fe : mov $0x4629c4,%edi void function(int a, int b, int c) { char buffer[5]; int *ret; ret = buffer + 12; (*ret) += 8; } int main() { int x = 0; […]

C中的堆栈溢出漏洞利用

问题实际上是关于C中的堆栈溢出。我有一个我不能为我的生活完成的分配,我已经查看了gdb中的所有内容,我只是无法想象它。 问题如下: int i,n; void confused() { printf(“who called me”); exit(0); } void shell_call(char *c) { printf(” ***Now calling \”%s\” shell command *** \n”,c); system(c); exit(0); } void victim_func() { int a[4]; printf(“[8]:%x\n”, &a[8]); printf(“Enter n: “); scanf(“%d”,&n); printf(“Enter %d HEX Values \n”,n); for(i=0;i<n;i++) scanf("%x",&a[i]); printf("Done reading junk numbers\n"); } int main() { printf("ls=736c — […]

使用gets 防止缓冲区溢出

gets的声明是: char * gets ( char * str ); 请注意str的最大尺寸的明显遗漏 。 cplusplus.com说2 : 请注意,gets与fgets完全不同:不仅使用stdin作为源,而且它不包括结果字符串中的结束换行符,并且不允许指定str的最大大小( 这可能导致缓冲区溢出 )。 并且: 最新版本的C标准(2011年)明确地将此function从其规范中删除。 该函数在C ++中已弃用(截至2011年标准,遵循C99 + TC3)。 当然,现在通常建议将fgets替换为gets ,因为它的声明如下所示: char * fgets ( char * str, int num, FILE * stream ); 它需要一个尺寸参数。 这使它比gets更安全。 既然我不愿意花钱去下载或购买C11 standard ,那么任何人都可以了解弃用gets的原因及其对未来代码的意义吗? 当fgets更安全时,为什么它存在于同一个地方? 为什么它只是刚刚被弃用?

如何在没有缓冲区溢出问题的情况下使用strncat?

我有一个缓冲区,我正在做很多strncat。 我想确保我永远不会溢出缓冲区大小。 char buff[64]; strcpy(buff, “String 1”); strncat(buff, “String 2”, sizeof(buff)); strncat(buff, “String 3”, sizeof(buff)); 而不是sizeof(buff),我想说一些buff – xxx。 我想确保我永远不会覆盖缓冲区

扫描溢出(“%8s”,字符串)?

我知道溢出普通代码是可能的: char string [9]; scanf(“%s”,string)。 但是有可能溢出scanf(“%8s”,字符串)? 图8只是一个例子。 我知道“%8s”就像分隔符一样,但我也注意到当我输入长度超过8个字符的字符串时,程序将因以下原因而终止: *堆栈粉碎检测到* :./a.out终止 ======= Backtrace:========= … 显然,有一个标志可以检测GCC默认打开的堆栈粉碎。 由于这是一个堆栈粉碎,我的猜测是它仍然可以溢出并执行任意代码。 与正常溢出相反,会破坏scanf(“%s”)的调用者,如果scanf(“%8s”)可能溢出,它将在scanf函数内溢出,以便当scanf尝试返回时,获得控制权。 但是scanf是一个系统调用,它需要模式切换(从用户模式切换到内核模式),并且在内部它会调用诸如read之类的东西到stdin等。所以不确定我们是否可以在内核模式或其他东西中溢出.. 欢迎评论!! 更新>> 在上面的例子中假设了char字符串[9]。 char字符串[8]在以下实际代码中。 问题实际上是关于安全扫描(“%8s”)和GCC流产之间由于堆栈粉碎而看似矛盾的故事。 简化代码: void foo(pass some pointer) { char input[8]; int input_number = 0; while (1) { // looping console printf some info; scanf(“%8s”, input); input_number = atoi(input); if ((strlen(input) == 1) && (strncmp(input, “q”, […]

哪些C / C ++工具可以检查缓冲区溢出?

我被要求维护一个充满内存泄漏的大型C ++代码库。 在探索时,我发现我们有很多缓冲区溢出导致泄漏(它如何变坏,我不想知道)。 我决定先删除缓冲区溢出。 为了使我的bug更容易找到,可以使用哪些工具来检查缓冲区溢出?

为什么这个内存地址%fs:0x28(fs )有一个随机值?

我写了一段C代码,我已经拆解了它,并且读取了寄存器以了解程序在汇编中的工作原理。 int test(char *this){ char sum_buf[6]; strncpy(sum_buf,this,32); return 0; } 我一直在研究的代码是测试function。 当我反汇编输出我的测试function时,我得到… 0x00000000004005c0 : mov %fs:0x28,%rax => 0x00000000004005c9 : mov %rax,-0x8(%rbp) … stuff .. 0x00000000004005f0 : xor %fs:0x28,%rdx 0x00000000004005f9 : je 0x400600 0x00000000004005fb : callq 0x4004a0 0x0000000000400600 : leaveq 0x0000000000400601 : retq 我想知道的是mov %fs:0x28,%rax真的在做什么?

为什么fgets函数已被弃用?

来自GNU C编程教程 : fgets (“file get string”)函数类似于gets函数。 这个函数已被弃用 – 这意味着它已经过时,强烈建议您不要使用它 – 因为它很危险。 这很危险,因为如果输入数据包含空字符,则无法分辨。 除非您知道数据不能包含null,否则不要使用fgets 。 不要使用它来读取用户编辑的文件,因为如果用户插入空字符,您应该正确处理它或打印清晰的错误消息。 如果可以,请始终使用getline或getdelim而不是fgets 。 我认为fgets函数遇到\0或\n时会停止; 当fgets应该正确处理输入时,为什么这个手册页建议空字节是“危险的”? 此外, getline和fgets之间的区别是什么,并且在C99或未来的C标准中真正被认为已弃用的fgets函数是什么?