Использование переполнения кучи для записи произвольных данных

Я пытался изучить основы атаки с переполнением кучи. В основном меня интересует использование повреждения или модификации метаданных чанка в качестве основы для атаки, но я также открыт для других предложений. Я знаю, что моей целью эксплойта должна быть перезапись указателя функции 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. Когда это не сработало, я попытался указать дальше на фрагмент inputB. Именно тогда я понял, что новый glibc выполняет проверку правильности значения размера.

Как пользователь может создать эксплойт, чтобы воспользоваться бесплатным, если у него есть возможность редактировать метаданные выделенного фрагмента на произвольные значения и использовать его для перезаписи значения в GOT или записи на любой другой произвольный адрес?

Примечание. Когда я пишу «произвольный адрес», я понимаю, что страницы памяти могут быть только для чтения или защищенными, я имею в виду адрес, по которому, как я полагаю, я могу писать.

22
задан amccormack 12 March 2012 в 11:38
поделиться