Переполняющиеся буфера - активные средства защиты

         

cсостояние стека функции


Сравните это с листингом 5. Разница незначительная, но принципиальная! По соображениям производительности, Pro-Police внедряет защиту адреса возврата только функции содержащие буфера, которые потенциально могут быть переполнены. То есть, Pro-Police совмещает в себе защитный механизм с системой аудита кода!

Pro-police предусматривает даже такую неочевидную ситуацию, как подмену указателей, переданных в качестве аргументов и надежно защищает их. В прологе аргументы копируются в промежуточные переменные, расположенные "над" переполняющимся буфером, а не "под" ним (где находятся оригинальные аргументы). В дальнейшем, все обращения к аргументам осуществляются через промежуточные переменные следующим образом:

foo (int a, void (*fn)())

{

       char buf[128];                    // локальный буфер

      

       gets

(buf);
                // функция, переполняющая буфер

       (*fn)();
                   // вызов функции, по указателю переданному

                                  // в качестве аргумента и затираемому

                                  // при переполнении

}



Содержание раздела