任何人都可以向我解释/向我展示这段代码如何获取输入,以及这段代码如何容易受到缓冲区溢出引起的电弧注入(inject)的影响?

标签 c buffer-overflow

谁能告诉我这段代码如何获取输入,以及这段代码如何容易受到缓冲区溢出引起的弧注入(inject)攻击?

#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>

将大小设置为 65

enum {SIZE = 65};

我试图改变的变量

int True = 0;
char name[SIZE];
FILE *f;
int i = 0;

这是如何从文件中读取的?

void read(char *s) {
   int c;
   char buffer[SIZE];

   for (;;) 
   {
      c = getchar();
      if ((c == EOF) || (c == '\n')) 
         break;
      buffer[i] = c;
      i++;
   }
   buffer[i] = '\0';

   for (i = 0; i < SIZE; i++) 
      s[i] = buffer[i];
}


int main(void) {
   read(name);

   if (!True) 
     printf("%s: You are a hacker\n", name);
   else
     printf("%s: You are not a hacker\n", name);

你怎么能不用返回值呢?

   exit(0);
}

最佳答案

此代码通过“stdin;”获取输入。默认情况下,这将通过键盘输入来完成。然而,当在命令行上加载程序时,也可以将文件的内容“管道”到“stdin”中。

此代码容易受到缓冲区溢出引起的弧注入(inject)攻击。具体来说,如果将超过 65 个字符复制到 'name' 数组中,'True' 的值将被覆盖。最有可能的是,这会将“True”的值更改为非零值。这将反转 'if (!True)' 并导致行 'printf("%s: You are a hacker\n", name);'执行。

关于任何人都可以向我解释/向我展示这段代码如何获取输入,以及这段代码如何容易受到缓冲区溢出引起的电弧注入(inject)的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23452078/

相关文章:

c - 使用结构时出错,C

c - 为什么 int *func(…..); 之间有区别和 int (*func)(….)?跟*号有关系吗?

c++ - 在 C/C++ 中防止缓冲区溢出

kernel-module - 缓冲区溢出漏洞不适用于内核模块

c - 使用 getchar() 清除输入缓冲区时如何避免按两次 Enter 键?

c - PaX 和缓冲区溢出

c++ - 内存对齐和长拷贝

c - 如何使用openCV提取颜色

c - *完全*相等的 double 为 (a==b) 返回 0

Linux - 无法生成核心转储