谁能告诉我这段代码如何获取输入,以及这段代码如何容易受到缓冲区溢出引起的弧注入(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/