Итак, в качестве учебного упражнения я хотел написать переполнение буфера. Однако я столкнулся с некоторыми проблемами, которые связаны с архитектурой 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.