(缓冲区溢出漏洞利用)无法覆盖 $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,但我不知道为什么。
我正在尝试利用带有缓冲区溢出的 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,但我不知道为什么。