0

我正在尝试利用缓冲区溢出的 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,但程序会绕过它们并继续进一步写入内存地址。

4

1 回答 1

0

好的,我刚刚找到了一个解决方案,我需要放置 44 * "A" 和 8 * "5" 然后我想要的返回地址并成功更改,尽管内存是这样的:

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

    44b    4b   4b   4b  4b

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

于 2018-05-17T23:10:37.280 回答