Я прочитал много статей о небезопасных функциях, таких как strcpy, memcpy и т.д., что может привести к проблемам безопасности при обработке внешних данных, таких как содержимое файла или данные, поступающие из сокетов. Это может показаться глупым, но я написал уязвимую программу, но мне не удалось "взломать" ее.
Я понимаю проблему переполнения буфера. Возьмите этот пример кода:
int main() {
char buffer[1];
int var = 0;
scan("%s", &buffer);
printf("var = 0x%x\n", var);
return 0;
}
Когда я запускаю программу и набираю "abcde", программа выводит 0x65646362, который является "edcb" в шестнадцатеричном + мало-endian. Однако я прочитал, что вы можете изменить значение eip, которое было нажато в стек, чтобы программа выполняла какой-то нежелательный код (например, прямо перед вызовом функции system()).
Однако сборка функции начинается следующим образом:
push %ebp
mov %ebp, %esp
and $0xfffffff0, %esp
sub $0x20, %esp
Так как значение% esp является случайным в начале функции, и из-за этого "и", похоже, нет надежного способа записать точное значение в значение push-значения.
Кроме того, я читал, что можно было выполнить код, который вы написали в буфере (здесь буфер длиной всего 1 байт, но на самом деле он был бы достаточно большим, чтобы хранить некоторый код), но какое значение вы бы дали eip для этого (учитывая, что местоположение буфера является случайным)?
Итак, почему разработчики так беспокоятся о проблемах безопасности (за исключением того, что программа может потерпеть крах)? У вас есть пример уязвимой программы и как "взломать" ее для выполнения нежелательного кода? Я пробовал это на Linux, Windows менее безопасна?