настройка системы для переполнения буфера отладки программы - PullRequest
0 голосов
/ 19 декабря 2011

Я помню, как читал давным-давно, что, если я хочу проверить переполнение буфера на моем компьютере с Linux, мне нужно что-то установить в системе, чтобы это произошло. Я не могу точно вспомнить, для чего это было, но я надеялся, что кто-то знает, о чем я говорю.

Я хочу иметь возможность проверить свои программы на наличие уязвимостей и проверить, не перезаписаны ли регистры.

РЕДАКТИРОВАТЬ: я использую Ubuntu 10.04

Ответы [ 2 ]

3 голосов
/ 19 декабря 2011

Один из вариантов - использовать отладчик памяти, например Valgrind .Однако обратите внимание, что Valgrind отслеживает только переполнения буфера в динамически выделенной памяти.

Если у вас есть возможность использовать C ++ вместо C, тогда вы можете переключиться на использование контейнеров, а не сырых массивов, и использовать GCCрежим «проверенного контейнера» (см. Проверка привязки GCC STL ).Я уверен, что другие компиляторы предлагают аналогичные инструменты.

0 голосов
/ 19 декабря 2011

Еще одна подсказка (в дополнение к ответу Оли ) при поиске ошибок памяти с помощью отладчика gdb заключается в отключении рандомизации макета адресного пространства , например,

 echo 0 > /proc/sys/kernel/randomize_va_space

После этого два последовательных запуска одной и той же детерминированной программы обычно будут mmap областей с одинаковыми адресами (от одного запуска к другому), и это очень помогает при отладке с помощью gdb (потому что тогда malloc обычно дает один и тот же результат от одного прогона к другому, в том же заданном месте в прогоне).

Вы также можете использовать команду watch gdb.В частности, если при первом запуске (с отключенной ASLR) вы полагаете, что расположение 0x123456 неожиданно меняется, вы можете дать gdb следующую команду при втором запуске:

 watch * (void**) 0x123456

Затем gdbсломается, когда это местоположение изменится (к сожалению, оно должно быть уже mmap).

...