Адрес возврата переполнения буфера имеет 00 - PullRequest
5 голосов
/ 25 марта 2011

Я просто пытался заставить переполнение буфера работать в OSX (10.6) в следующей программе; Мне нужно, чтобы foo выполнялся путем переполнения буфера.

#include <string.h>
#include <stdio.h>
void foo() {
    printf("hacked!");
}
int main(int argc, const char *argv[]) {
    char s[100];
    strcpy(s, argv[1]);
}

Я компилирую это как: -

$ gcc -o test test.c -arch i386

При разборке test Я получаю адрес foo как 0x00001eda. Эксплойт не работает как задумано; вероятно, потому что адрес возврата должен быть переполнен 0x00001eda с содержит \x00.

В тех случаях, когда целевой адрес имеет \x00, как можно использовать эксплойт переполнения буфера?

Ответы [ 3 ]

2 голосов
/ 04 апреля 2011

Функция strcpy() останавливается, когда встречается нулевой байт (\x00).Поскольку адрес, который вы хотите записать в стек , может содержать такой байт, возможно, допустимо сделать что-то аналогичное одному из следующих примеров.

отказ от ответственности

Из-за моего отсутствия доступа к среде OS X 10.6, следующий код был разработан и протестирован на 64-битной Windows 7 с использованием GCC 4.5.2 (MinGW 32-bit).Я использовал gdb для определения как адреса foo(), так и местоположения адреса возврата в кадре стека.Дальнейшее объяснение того, как я использую GDB для определения смещения от буфера до адреса возврата, предоставлено здесь .


Пример 1

код

int main()
{
    char s[4];
    gets(s);
}

Размер буфера был уменьшен, чтобы использовать более короткий входной текст для переполнения буфера.

выход

gcc -g -fno-stack-protector -o test test.c
printf 1234567890abcdef \ xc6 \ x13 \ x30 |./test
взломан!


Пример 2

код

int main(int argc, const char *argv[])
{
    char s[100];
    sscanf(argv[2], "%x", &s[atoi(argv[1])]);
}

Использование atoi () для непосредственного нацеливания на адрес возврата не является хорошим примером «переполнения буфера».Тем не менее, это хорошее упражнение в поиске и изменении адреса возврата в кадре стека.

output

gcc -g -fno-stack-protector -o test test.c
./test 112 4013c6
взломан!

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

Помните, что все целые числа (и я уверен, что это включает в себя адреса возврата) хранятся в формате с прямым порядком байтов, что означает, что младшие значащие байты идут первыми.

Следовательно, байты желаемогообратный адрес (0x00001eda) будет:

0xda, 0x1e, 0x00, 0x00

Посмотрите на код , с которым karlphillip связал вас.Он вставил только два байта адреса в конец своей строки.Вы могли бы сделать то же самое.Функция strcpy с удовольствием скопирует два байта в конце вашей строки в стек и успешно добавит нулевой символ завершения (\ x00).Поэтому strcpy может установить первые 3 байта поддельного адреса возврата.Если вам повезет, возможно, 4-й байт уже будет \ x00, потому что 4-й байт правильного обратного адреса был \ x00?

Это не мой опыт, поэтому я могу ошибаться.

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

По какой-то причине мне не удалось переопределить стек и регистры с помощью strcpy , даже несмотря на сбой приложения.

Этот вопрос относится к вашему, и мне удалось сделать трюк, используя этот код .

...