Есть ли способ отключить защиту от переполнения буфера на моей машине?

11

Я хочу провести некоторые эксперименты с переполнением буфера на разных виртуальных машинах, включая (но не ограничиваясь этим) Debian 6, Ubuntu 12.04, Fedora 16, но каждый раз, когда я пытаюсь выполнить эксплойт с переполнением буфера, я получаю следующее сообщение:

stack smashing detected (core dumped)

Проведя исследование, я прочитал, что в компиляторе реализована функция защиты от переполнения буфера . GCC , например , использует GCC-Стек Разбивающийся протектор (ProPolice) , Clang / LLVM использует два детектора переполнения буфера, SafeCode и AddressSanitizer .

Мой вопрос: поскольку я действительно хочу проверить атаки переполнения буфера на моих машинах, есть ли способ (флаг компилятора, возможно, файл конфигурации Linux), чтобы отключить защиту от переполнения буфера?

NlightNFotis
источник

Ответы:

16

НКУ

В gcc ( man gcc) проверки включены

  -fstack-protector
      Emit extra code to check for buffer overflows, such as stack smashing attacks.  >This is done by adding a guard variable to functions with
      vulnerable objects.  This includes functions that call alloca, and functions with >buffers larger than 8 bytes.  The guards are initialized when
      a function is entered and then checked when the function exits.  If a guard check >fails, an error message is printed and the program exits.

  -fstack-protector-all
      Like -fstack-protector except that all functions are protected.

Вы можете отключить оба, добавив no-к названию опции

-fno-stack-protector -fno-stack-protector-all

LLVM / Clang

На LLVM / Clang ( http://clang.llvm.org/docs/UsersManual.html#commandline ), чтобы включить / отключить AdressSanitizer:

-f [no-] address-sanitizer: Включить AddressSanitizer, детектор ошибок памяти.

и SAFECode ( http://safecode.cs.illinois.edu/docs/UsersGuide.html )

-f [нет-] memsafety

Matteo
источник
2
Есть ли (простой) способ определить, была ли программа скомпилирована с SSP?
Мичуельник
2
@Michuelnik вы можете увидеть, если бинарный файл содержит какую-либо ссылку __stack_chk_fail(например,strings /bin/mybinary | grep __stack_chk_fail
Маттео
6
я просто проверял с GCC 4.7 и 4.1: опция -fno-stack-protector-allне признается ( -fstack-protector, -fstack-protector-allи -fno-stack-protectorпризнаются)
Marcin
gcc: error: unrecognized command line option ‘-fno-stack-protector-all’; did you mean ‘-fstack-protector-all’?
Clément