Не понимаю как исполнить мой код при переполнении буфера. Например есть такой простой код: Код (Text): void problem_function (char* big_str) { char small_str[8]; strcpy(small_str, big_str); } int main(int argc, char *argv[]) { if (argc < 2) { printf("usage: %s string\n", argv[0]); return 1; } problem_function (argv[1]); return 0; } Я передаю строчку большой длины и перезаписываю адрес возврата в main, допустим в строке есть и сам код. Но одкуда я узнаю eip моего кода при построении строки? Также смущает, что атакуемая прога упадет, что заметно.
Используюя переполнение буфера, ты применяешь его на заранее известной программе. Тебе надо найти в этой программе такое сочетаение байт, которое составило бы команду jmp esp. Это могут быть даже байты из заголовка. Потом просто статически прописать адрес этой команды вместо адреса возврата. С большой долей вероятности ты прыгнешь в стек на свой шеллкод. А то, что программа упадет - ты ведь можешь сделать корректный ExitProcess или, если код в отдельном треде, ExitThread. А вообще да, такой недостаток существует
а где ж он тогда выполняется? )) все переполнение стека основано на том, чтобы заменить адрес возврата и прыгнуть на свой код, который в локальном буфере прописан. Разве нет? Деп работает только в хр сп3, 2к8 и висте... А в хп сп2 нет! Да и названные ос под большим вопросом - пробивают же их как-то
я и не говорю, что его нет просто в хр сп2 можно на него не обращать внимания (по крайней мере по умолчанию)
MSoft Как это деп в хрю не работает ? _security_check_cookie/__report_gsfailure во всех версиях есть. Также как и в страницах стека запрещено исполнение кода. Так откуда вы взяли что его нет этого механизма ?
повторюсь еще раз - я не говорил, что его нет. Но в ХП СП2 можно выполнить код на странице без аттрибутов исполнения. Кроме непосредственно собственного опыта скажу, что мой упаковщик работал нормально во всех осях, а в перечисленных (см. пост 4) падал! Как только я добавил VirtualProtect, все заработало и на них. НО на ХП СП2 и ниже и без VirtualProtect'а у всех моих знакомых, которые пользовались моим упаковщиком, все прекрасно работало. Собссно исходя из этого я и сделал такой вывод
м.. и в самом деле код в стеке выполняется (xpsp2) Код (Text): format PE virtual at 0 push _exit retn align 4 load c1 dword from 0 load c2 dword from 4 end virtual pushd c2 pushd c1 jmp esp _exit: pop eax pop eax xor eax,eax ret
MSoft Ну попробуй скопируй в стек код и исполни его там, не изменяя атрибуты страниц. Когда у меня была XPSP2 и я это пытался исполнить возникало исключение. Чтото я сомневаюсь что код у товарища выше работает, хотя возможно хз. Но полюбому в критических функциях используется проверка куков, так что переписать стек весьма проблемно.
Clerk Разумеется работает. Да и по большому счёту без NX/XD никакого особо надёжного DEP'а быть не может.
когда я сказал "нет", я имел ввиду "нет, не работае", а не "нет, он отсутствует". Я не знаю почему он не работает - отключен по дефолту или поломался, но такое явление имеет место быть. Собсно, ты ж мои слова и подтвердил только что
Код (Text): sub esp, 4 mov byte ptr [esp], 0xC3 mov eax, esp call eax add esp, 4 push 0 call ExitProcess ХР sp2 ru professional - код отработал без ошибок и варнингов
Конечно, работает. Для нормального функционирования механизма запрета выполения кода в некоторых участках памяти нужна поддержка не только ОС, но и процессора - биты NX/XD.
У меня сейчас тоже работает XPSP3. И без разницы включена ли аппаратная защита, так как моё железо не поддерживает это. Раньше я использовал для некоторых обработчиков модель возврата, при которой Ret и есчо несколько инструкций исполнялисьв стеке. При тесте у некоторых моих друзей это работало, у других возникало исключение при передаче управления на стек и в дальнейшем я от этого отказался, так как не универсальный механизм. Более того, DEP это не только защита страницы от исполнения, это совокупность механизмов, предотвращающих исполнение кода, в непредназначенных для этого местах. Это аппаратная защита, атрибуты страниц, проверки куков в стеке и пр., нельзя учитывать лишь толькоаппаратную защиту.
Не поленился перезагрузиться чтобы включить DEP (XP home SP3) - пример _int2e_ начал падать с DEP предупреждением, зато перестал работать Punto Switcher - безо всяких предупреждений - иконка в трее висит, меню всплывает, а переключать не хочет ни автоматически, ни вручную )