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

#define BUFSIZE 30

char grade = '3';
char Name[BUFSIZE];

void readString(char *s) {
char buf[BUFSIZE];
int i = 0;
int c;

while (1) {
  c = fgetc(stdin);
  if ((c == EOF) || (c == '\n'))
     break;
  buf[i++] = c;
}
buf[i] = 0;

for (i = 0; i < BUFSIZE; i++)
  s[i] = buf[i];

return;
}

int main(void) {
  mprotect((void*)((unsigned int)Name & 0xfffff000), 1,
         PROT_READ | PROT_WRITE | PROT_EXEC);

  printf("What is your name?\n");
  readString(Name);

    if (strcmp(Name, "smart guy") == 0)
     grade = '6';

    printf("Thank you, %s.\n", Name);
    printf("I recommend that you get a grade of %c on this  assignment.\n",
         grade);

 exit(0);
  }


我试图通过给一个随机的名字(当然是“聪明的家伙”除外)来超越成绩的缓冲区,并使其给我6。此外,我试图再次给它一个随机的名字并给我9,你能帮我吗可能。我正在尝试在缓冲区上进行一些组装,但没有那么成功

最佳答案

一些编译器具有一个内存映射文件,您可以在编译后检查该文件。具体来说,检查以查看变量grade和数组buf的地址。如果为变量grade分配的地址早于数组buf的地址,则如果数组buf溢出,则grade的值将不会更改。

关于c - 缓冲区溢出攻击,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30304938/

10-08 22:01
查看更多