#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可以帮助我怎么可能这是可能的。我正在尝试缓冲区上的一些程序集,但它没有那么成功
答案 0 :(得分:1)
某些编译器有一个内存映射文件,您可以在编译后检查。具体来说,检查变量等级和数组buf的地址。如果为变量 grade 分配的地址早于数组 buf 的地址,那么如果数组 buf < grade 的值将不会更改< / em>超限。