Атака переполнения буфера в Windows приводит к нарушению прав доступа - PullRequest
4 голосов
/ 10 апреля 2011

Я только начал изучать, как переполнение буфера атак работает, и попытался симулировать атаку на Windows 7 с помощью Visual C 2010. Атака переполнения буфера очень надуманная, она просто перезаписывается адрес возврата к адресу "буферной" локальной переменной. В буфере хранится строка шеллкода.

Запускаю ли я программу в Visual Studio 2010 Debug или нет, программа перейдет к шелл-коду и почти начнет его выполнение, но я получаю ошибку Access Violation, и программа не будет продолжаться выполнение шеллкода.

Почему я получаю эту ошибку? Это какая-то защита от переполнения буфера в Windows?

Как вы получите программу для выполнения шелл-кода в буфере?

редактирование:

Ганс (ответ) правильный. Это обсуждается в главе 5, посвященной безопасности Windows, и причиной ошибки является реализация Microsoft защиты исполняемого пространства .

Если бы этот вопрос кому-нибудь помог, любые положительные голоса приветствуются.

void execute_my_shellcode()
{
    char buffer[24];
    memcpy(buffer, "\x6A\x21\xFF\x15\x40\x62\x40\x00\x83\xC4\x04\x6A\x0A\xFF\x15\x40\x62\x40\x00\x83\xC4\x04\xC3", 24); 
    printf("current return address: %p\n", *(int*)((char*)&buffer + 24 + 4));   
    *(int*)((char*)&buffer + 24 + 4) = (int)&buffer; 
    printf("return address is now : %p\n\n", (int*)*(int*)((char*)&buffer + 24 + 4) );
}

Ответы [ 4 ]

7 голосов
/ 10 апреля 2011

Это могло бы сработать 10 лет назад.Эти очевидные дыры в безопасности были исправлены, бит без выполнения , который в настоящее время поддерживают процессоры, является одной из контрмер.

1 голос
/ 07 мая 2012

Прежде всего, ваш шеллкод содержит нули.Вернитесь к своему шелл-коду и найдите инструкции, которые не выдают нулевые коды операций (0x00), чтобы ваш шелл-код не обрабатывался как строка.

Во-вторых, нарушение доступа не обязательно означает, что оно является причинойкакой-то тип схемы защиты.Это может быть (из-за прихоти), что ваш обратный адрес или шелл-код пытается заставить регистр EIP перейти в место, которое не может быть выполнено в памяти.

Вам придется истечь больше.Каждый компилятор и компьютер будут разными.Есть способы обойти почти все.Возможно, вы захотите больше изучить эту тему в целом, но первое, что я хотел бы предложить, это создать повторяющийся адрес возврата, который указывает на сани NOP в буфере перед шелл-кодом, чтобы ваш шелл-код выполнялся более эффективно и, вероятно, был болееТочно.

Защита исполняемого пространства, как вы указали, является правильной, но мои ответы выше неформальны и необходимы в большинстве случаев.Удачного взлома:)

1 голос
/ 11 апреля 2011

Существуют и другие средства защиты от атак переполнения буфера, которые могут сделать это невозможными, такие как защитные страницы в каждом начале и конце кадра стека. Существует рандомизация макета адресного пространства и другие. Здесь - статья на эту тему.

Дело в том, что ваш шелл-код может содержать нуль-байты или другие типы недопустимых символов, которые при преобразовании не превращаются в инструкцию или действительный адрес ... Это вам нужно выяснить.

примечание Я не даю этот последний совет для злоупотребления. Вы несете ответственность за по закону и правильно используете этот совет.

0 голосов
/ 11 апреля 2011

Где именно программа ломается? Вы пытались использовать OllyDbg для пошагового выполнения инструкций по сборке, чтобы увидеть, запускаете ли вы по крайней мере запуск буфера или отказали до этого? Если вы не выполняете даже первую инструкцию в буфере, то, вероятно, страница стека (или раздел данных в этом случае, поскольку вы предоставляете ее как строковый литерал) была помечена как неисполняемая, и вам придется использовать другой метод. , Возможно, есть способ заставить Windows сделать исполняемую страницу стека (или раздел данных в данном случае) для целей тестирования / обучения (я знаю, что двоичные файлы ELF имеют исполняемый флаг стека, а Linux предоставляет утилиту execstack для редактирования флага). .

Если он прерывается после нескольких инструкций из вашего буфера, то, скорее всего, потому, что инструкции в вашем буфере пытаются (косвенно) вызвать абсолютный адрес (0xff 0x15 0x40 0x62 0x40 x00 => call dword ptr ds:[406240]) и в W7, address рандомизация размещения пространства (ASLR) может быть включена (я не уверен, что компоновщик VS2010 устанавливает бит IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE в заголовке PE по умолчанию).

Редактировать

На основании дополнительной информации, которую вы добавили в вопрос, может показаться, что проблема неисполняемого стека, упомянутая в моем первом абзаце, является виновником. Однако, даже если вы обойдете эту проблему, вторая проблема все еще может быть проблемой, так как вы не знаете, что будет в 0x00406240, если включен ASLR.

...