дизассемблерный листинг
При компиляции с ключом -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 ; // возвращаемся в материнскую процедуру