C 复制到两个缓冲区中,尽管应该只填充一个缓冲区

标签 c gcc gdb buffer-overflow

我用 C 写了一些代码,应该 strcpy 一些输入数据到声明的缓冲区。这是代码:

#include <stdio.h>
#include <string.h>

void function(char *args) {
  char buff_1[12];
  char buff_2[3] = "ABC";

  strcpy(buff_1, args);
  printf("buff_1: %s \n", buff_1);
  printf("buff_2: %s \n", buff_2);
}

int main(int argc, char *argv[]) {
  printf("Input: ");

  if(argc > 1)
    function(argv[1]);

  return 0;
}

如果我现在运行二进制文件,我会假设超过 11 个输入参数的所有内容都会导致缓冲区溢出,但实际上它会将我的输入附加到两个缓冲区:

./main (perl -e 'print "A"x15')
buff_1: AAAAAAAAAAAAAAA 
buff_2 :ABCAAAAAAAAAAAAAAA

同时使用 gdb 检查变量显示我的输入参数存储在两个缓冲区中:

(gdb) x/1s buff_1
0xffffd284: 'A' <repeats 11 times>
(gdb) x/1s buff_2
0xffffd281: "ABC", 'A' <repeats 11 times>

我使用以下命令编译代码:gcc -m32 -O0 -g -fno-stack-protector -o main main.c 使用 gcc (Ubuntu 5.2.1-22ubuntu2 )

谁能解释一下这是怎么可能的?

最佳答案

您没有足够的空间用于 buff_2 的空终止。所以 printf("buff_2: %s\n", buff_2); 会溢出你的缓冲区,导致未定义的行为

char buff_2[3] = "ABC"; // Not enough space for \0 
char buff_2[4] = "ABC"; // OK
char buff_2[] = "ABC";  // OK, Size will be 4

关于C 复制到两个缓冲区中,尽管应该只填充一个缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36866476/

相关文章:

python - GDB pretty-print : Python Exception <type 'exceptions.LookupError' > no codec search functions registered: can't find encoding

c - gdb 调试器错误 : "-var-create: Unable to create variable object"

c - 输入 esc 字符存储十进制值 10,而它应该显示值 27

python - 是否可以在python中定义c类型变量并将其地址传递给cython包装的函数

c - 循环条件中使用的变量未在循环体中修改

Linux:可执行文件找不到共享库

gdb - gdb(MinGW)中的输入重定向

c - 如何在 C89 中获取 SIZE_MAX

c - 使用单个变量/寄存器存储 2 个值(并通过位掩码和/或字长的特定 CPU 指令读取它们)

c++ - 为什么局部静态变量是 BSS 段的一部分?