(缓冲区溢出漏洞利用)无法覆盖 $ebp 和 $eip 寄存器

(Buffer Overflow Exploit) Can't overwrite $ebp and $eip registers

我正在尝试利用带有缓冲区溢出的 C 程序。 缓冲区的大小为 44 字节。 (字符缓冲区[44];)。 我想用另一个地址覆盖 $eip 寄存器,但似乎 $ebp 寄存器和 $eip 都没有被覆盖。该程序只是绕过它们,并用星号填充两个寄存器后的地址,它甚至没有给出分段错误。可能是什么问题?我post一张输入为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 何时将被覆盖,但程序绕过它们并继续进一步写入内存地址。

好的,我刚刚找到了一个解决方案,我需要把 44 * "A" 和 8 * "5" 然后是我想要的 return 地址,它成功地改变了,虽然内存是像这样:

-----[缓冲区][int c][int i][ebp][eip]------

    44b    4b   4b   4b  4b

所以,我在 52 字节位置插入 ( 44 * "A" + 8 * "5") 但它通常必须在位置 56。它适用于 52,但我不知道为什么。