Я пытаюсь изучить основы атаки переполнения кучи. Меня больше всего интересует использование коррупции или модификация метаданных фрагмента для основы атаки, но я также открыт для других предложений. Я знаю, что моя цель эксплойта должна быть перезаписана указателем функции printf()
с указателем функции challenge()
, но я не могу понять, как добиться этой записи.
У меня есть следующий фрагмент кода, который я хочу использовать, используя malloc
из glibc 2.11.2
:
void challenge()
{
puts("you win\n");
}
int main(int argc, char **argv)
{
char *inputA, *inputB, *inputC;
inputA = malloc(32);
inputB = malloc(32);
inputC = malloc(32);
strcpy(inputA, argv[1]);
strcpy(inputB, argv[2]);
strcpy(inputC, argv[3]);
free(inputC);
free(inputB);
free(inputA);
printf("execute challenge to win\n");
}
Очевидно, что достижение фактической перезаписи выделенных метаданных фрагментов является тривиальным. Однако я не смог найти способ использовать этот код, используя любой из стандартных методов. Я прочитал и попытался реализовать методы из:
- Бумага: w00w00 на Переполнение кучи
- Несмотря на то, что документ очень ясен, метод
unlink
устарел в течение некоторого времени.
- Несмотря на то, что документ очень ясен, метод
- Malloc Maleficarum.txt
- Этот документ расширяет методы эксплойтов из w00w00 дней и учитывает новые версии glibc. Тем не менее, я не нашел, что, учитывая 5 методов, подробно описанных в документе, код выше соответствует любому из предпосылок для этих методов.
- Понимание кучи, разбивая его (pdf)
- В pdf файле дается довольно хороший обзор того, как работает куча, но фокусируется на двойных бесплатных методах.
Первоначально я пытался использовать этот код, манипулируя значением размера блока для inputC, так что он обратил внимание на голову блока inputC. Когда это не сработало, я попытался еще раз вернуться к блоку ввода B. То есть, когда я понял, что новый glibc выполняет проверку работоспособности по размеру.
Как пользователь может воспользоваться эксплойтом, чтобы воспользоваться бесплатным, считая, что у него есть возможность редактировать выделенные метаданные куска на произвольные значения, и пользователь может перезаписать значение в GOT или записать на любой другой произвольный адрес?
Примечание. Когда я пишу "произвольный адрес", я понимаю, что страницы памяти могут быть только для чтения или защищены, я имею в виду адрес, который, как я могу предположить, могу написать.