Добрый день! У меня возникла проблема при реализации переполнения буфера. Если я делаю прямо в программе так: char buffer[4]; strcpy(buffer, "AAAA\xf9\xc0_и.т.д._мой_шеллкод_"); То шеллкод выполняется и все работает. Если же я пишу в программе char buffer[4]; strcpy(buffer, argv[1]); И пытаюсь подать программе на вход шеллкод, то программа крашится. Отсюда у меня возникли мысли, что возможно эту проблему как-то контролирует сама ОС? (Win 8.1) Подскажите, так ли это? Если так, то возможно ли отключить этот контроль?
Ответ
Такими вещами занимается пара из ОС и компилятора. Например, Visual Studio содержит ключ /GS (по умолчанию включён), который активизирует т. н. stack canary: в определённые места в стеке записывается случайное число, и если впоследствии это число оказывается затёрто, детектируется stack smash. Чтобы отключить, попробуйте ключ /GS- Кроме того, в отладочном режиме Visual Studio вставляет дополнительные проверки границ массивов, так что вам, возможно, придётся переключиться в Release Mode (или поискать, как это отключается в свойствах проекта). По поводу разницы в поведении Release и Debug Mode. Для начала: выход за границу выделенной памяти есть undefined behaviour. Убедитесь, что вы в курсе этого понятия, оно отвечает за 95% проблем в безопасности; вы, как будущий специалист по software security, должны это особенно отчётливо понимать. Undefined behaviour значит, что компилятор не имеет никаких обязательств в этой ситуации, и любое поведение программы правильно. Теперь, в случае отладочного режима, компилятор специально для разработчиков вставляет проверки на затирание памяти для того, чтобы сообщить об ошибке как только она случится (иначе найти проблему будет сложнее). Такой контроль не требуется по стандарту, и разумеется отнимает время пробега программы. В случае release-режима, такие проверки не вставляются для ускорения работы программы, и вся безопасность держится на stack canaries, ASLR, NX-битах и тому подобных менее надёжных вещах. Которые тоже, строго говоря, не требуются стандартом, и вставляются исключительно по доброй воле разработчиков компилятора (и к тому же отключаются соответствующими ключами).
Комментариев нет:
Отправить комментарий