Я пытался изучить основы атаки с переполнением кучи. В основном меня интересует использование повреждения или модификации метаданных чанка в качестве основы для атаки, но я также открыт для других предложений. Я знаю, что моей целью эксплойта должна быть перезапись указателя функции 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");
}
Очевидно, что достижение фактической перезаписи метаданных выделенного фрагмента тривиальный.Однако мне не удалось найти способ использовать этот код с помощью каких-либо стандартных методов. Я прочитал и попытался реализовать техники из:
unlink
уже давно устарела.Первоначально я пытался использовать этот код, манипулируя значением размера фрагмента для inputC, чтобы оно указывало на начало фрагмента inputC. Когда это не сработало, я попытался указать дальше на фрагмент inputB. Именно тогда я понял, что новый glibc выполняет проверку правильности значения размера.
Как пользователь может создать эксплойт, чтобы воспользоваться бесплатным, если у него есть возможность редактировать метаданные выделенного фрагмента на произвольные значения и использовать его для перезаписи значения в GOT или записи на любой другой произвольный адрес?
Примечание. Когда я пишу «произвольный адрес», я понимаю, что страницы памяти могут быть только для чтения или защищенными, я имею в виду адрес, по которому, как я полагаю, я могу писать.