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

         

псевдокод уязвимой функции


Int32  random_number;                    // глобальный canary, генерируемый случ. образом

foo

(int a, void (*fn)())         // уязвимый аргумент-указатель

{

       volatile int32 guard;             // локальная копия canary, охраняющая кадр

       char buf[128];                    // буфер идет перед переменными, но после аргум.

       (void *safefn)() = fn;     // копируем аргумент во временную переменную

       guard = random_number;            // копируем глобальный canary в лок. переменную

      

       gets

(buf);
                // вызываем уязвимую функцию

      

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

       if (guard != random_number) /* program halts */

}



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