Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t在缓冲区溢出的Windows上修改RIP寄存器_Windows_64 Bit_Cpu_Cpu Registers_Buffer Overflow - Fatal编程技术网

Can';t在缓冲区溢出的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

作为一个学习练习,我想写一个缓冲区溢出。然而,我遇到了一些似乎与x64体系结构有关的问题。我发现了以下内容,并试图重新创建这些步骤

结果是,我可以在32位窗口上覆盖EIP,但不能在64位窗口上覆盖RIP。我想知道为什么我不能在64位Windows上覆盖RIP

我发现这一页有详细的手册,但是我真的不知道应该先读哪一本手册,或者如果答案会出现在这些手册中,那么这看起来是一个很好的开始

#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位编译时不会发生这种情况。