Почему при попытке переполнения буфера происходит ошибка? - PullRequest
0 голосов
/ 29 марта 2012

Мне интересно, почему эксплойт переполнения буфера не работает в конкретном сценарии.На данный момент переполнение, над которым я работаю, может перенаправить адрес возврата, и когда я сосредоточусь на куске памяти, скажем <_fini>, программа завершит работу, не выполнив ничего, что последует за функцией.Странная вещь, когда я пытаюсь перенаправить память в переменную окружения.По некоторым причинам это не работает из-за ошибки сегментации.У кого-нибудь есть идеи, почему это так?

Вот код

#include <stdio.h>

void func(char *buff){  
    char buffer[5];
    strcpy(buffer, buff);
    printf("%s\n", buffer);
}

int main(int argc, char *argv[]){
    func(argv[1]);
    printf("I'm done!\n");
    return 0;
}

Ответы [ 2 ]

1 голос
/ 05 июня 2012

Я написал небольшую статью о переполнении буфера, используя переменные окружения, которые могут быть вам полезны: http://pinkmist.dyndns.org:8080/2012/04/24/basic-stack-overflow/. Существует множество причин, которые могут вызвать вашу проблему. Я должен спросить, вы пытались написать переполнение буфера без переменных окружения еще? Я обнаружил, что использование переменных среды делает вещи намного проще, но, вероятно, это хорошее упражнение для обучения, которое действительно поможет вам понять, почему эти вещи работают. Еще несколько вещей для размышления, о которых я упомянул выше: ASLR и защита от разбивания стека в GCC. Любая из этих вещей действительно может поставить вас в тупик. Убедитесь, что вы отключили ASLR и защиту от разрушения стека (оба включены по умолчанию в любом современном дистрибутиве).

0 голосов
/ 09 марта 2013

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

Либо снимите защиту (точная процедура будет зависеть от операционной системы), либо ограничьте себя адресами памяти, помеченными как исполняемые.

...