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