Невозможно изменить регистр RIP на Windows с переполнением буфера - PullRequest
0 голосов
/ 30 января 2020

Итак, в качестве учебного упражнения я хотел написать переполнение буфера. Однако я столкнулся с некоторыми проблемами, которые связаны с архитектурой x64. Я обнаружил следующую запись переполнения стека и пытался воссоздать шаги.

В результате я могу перезаписать EIP на 32-битном Windows, но не могу перезаписать RIP на 64-битном Windows. Я хотел бы знать, почему я не могу перезаписать RIP на 64-битной Windows?

Я нашел эту страницу с руководствами, подробно описывающими архитектуру Intel , однако я искренне не представляю, какое из этих руководств прочитать первым, или ответ будет даже в тех руководствах, на которые он только что выглядел хорошее место для начала.

#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;
}

Например, если вы вводите строку А в качестве входных данных для программы при работе в 32-битном режиме (с такими вещами, как / GS, в Visual Studio), вы можете перезаписать EIP. Однако, если вы попытаетесь сделать это в программе, когда она скомпилирована для 64-битной системы, ваш RIP не будет заполнен буквами A.

...