Can';t在缓冲区溢出的Windows上修改RIP寄存器
作为一个学习练习,我想写一个缓冲区溢出。然而,我遇到了一些似乎与x64体系结构有关的问题。我发现了以下内容,并试图重新创建这些步骤 结果是,我可以在32位窗口上覆盖EIP,但不能在64位窗口上覆盖RIP。我想知道为什么我不能在64位Windows上覆盖RIP 我发现这一页有详细的手册,但是我真的不知道应该先读哪一本手册,或者如果答案会出现在这些手册中,那么这看起来是一个很好的开始Can';t在缓冲区溢出的Windows上修改RIP寄存器,windows,64-bit,cpu,cpu-registers,buffer-overflow,Windows,64 Bit,Cpu,Cpu Registers,Buffer Overflow,作为一个学习练习,我想写一个缓冲区溢出。然而,我遇到了一些似乎与x64体系结构有关的问题。我发现了以下内容,并试图重新创建这些步骤 结果是,我可以在32位窗口上覆盖EIP,但不能在64位窗口上覆盖RIP。我想知道为什么我不能在64位Windows上覆盖RIP 我发现这一页有详细的手册,但是我真的不知道应该先读哪一本手册,或者如果答案会出现在这些手册中,那么这看起来是一个很好的开始 #include <iostream> #include <string> #include
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
struct Buffers {
char buffer1[6];
char buffer2[6];
};
int main(int argc)
{
string input;
cin >> input;
Buffers b = {};
strcpy(b.buffer2, "Hello");
cout << b.buffer2 << endl;
strcpy(b.buffer1, input.c_str());
cout << b.buffer2 << endl;
}
#包括
#包括
#包括
使用名称空间std;
结构缓冲区{
字符缓冲区1[6];
字符缓冲区2[6];
};
int main(int argc)
{
字符串输入;
cin>>输入;
缓冲区b={};
strcpy(b.buffer2,“你好”);
有一点值得注意的是,现代编译器和操作系统有各种各样的保护措施,比如堆栈金丝雀,可以防止幼稚的缓冲区溢出攻击。如果你想把这作为练习,你可能必须禁用这些保护措施。你说的“覆盖RIP”是什么意思?您的意思是覆盖堆栈上的返回地址,还是让计算机实际尝试返回到新地址?您做了哪些测试以得出结论认为这不会发生?您将程序作为输入,以及如何选择它?我将程序附加到X64dbg,并尝试提供一个a字符串作为输入。编译时对于32位,您可以让调试器中的指令指针(EIP寄存器)读取4141,但对于64位编译时不会发生这种情况。