我正在尝试利用缓冲区溢出的 C 程序。缓冲区的大小为 44 字节。(字符缓冲区[44];)。我想用另一个地址覆盖 $eip 寄存器,但似乎 $ebp 寄存器和 $eip 都没有被覆盖。该程序只是绕过它们,并在两个寄存器之后填充地址,甚至没有给出分段错误。可能是什么问题?我发布了一张输入为 71“A”的照片。
#include <stdio.h>
#include <sys/mman.h>
#include <string.h>
#include <stdlib.h>
#include "bufsize.h"
char grade = '3';
char Name[44];
void readString(char *s) {
char buf[44];
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 < 44; 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, "Alex") == 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);
}
我想编辑 eip 寄存器,使其引发分段错误,然后编辑 eip 以使程序打印 6 而无需输入字符串“Alex”作为输入。我在 while(1) 循环之后放置了一个断点,并使用 x/50x $esp 检查内存地址以查看何时会覆盖 ebp 和 eip,但程序会绕过它们并继续进一步写入内存地址。