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

         

дизассемблерный листинг


При компиляции с ключом -d, Stack-Shiled вставляет дополнительную проверку, сравнивая адреса возврата на стеке и retarray'е. В случае расхождения вызывается функция SYS_exit, завершающая программу в аварийном режиме.

Ключи -r и -g задействуют механизм "Ret Range Checking", проверяющий границы адресов возврата и останавливающий программу, если они выходят за пределы некоторой заранее заданной величины (т. е. находятся в куче или стеке). Таким образом, даже если хакер перезапишет retarray (а он находится в записываемой области памяти), подсунуть указатель на shell-код ему уже не удастся, правда, он может беспрепятственно вызывать функции библиотеки libc, передавая им любые аргументы (атака типа return-to-libc).

function_epilogue:

       leave                ; // закрываем кадр стека небезопасным путем

       cmp [esp], offset shielddatabase

                           ; // ^ проверяем границы адреса возврата

       jbe .LSHIELDRETRANGE ; // если все ок, то прыгаем на ret

      

       movl eax,1           ; // если мы здесь, то адрес возврата вышел

       movl ebx,-1          ; // за допустимые пределы, возможно он был хакнут

       int 80h              ; // завершаем выполнение программы

      

.LSHIELDRETRANGE:

       ret                  ; // возвращаемся в материнскую процедуру



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