Понимание и выполнение Инжекции Кода в C

Вы будете заботиться, является ли Ваш профиль пользователя несколькими устаревшими секундами?

Несколько секунд определенно были бы приемлемы. Не кажется, что случалось бы так, что долго, так или иначе, если огромное количество людей не отправляют ответы одновременно.

9
задан Recursion 15 November 2009 в 23:53
поделиться

3 ответа

Общий трюк заключается в том, как программный код и переменные размещаются в памяти. Например, когда функция вызывается, программа (код, вставленный компилятором) должна сохранять адрес инструкции, к которой нужно вернуться. Итак, если это 32-битное слово непосредственно перед началом стека, можно сделать следующее:

 void foo()
 {
    int array[5];
    int var = 0;
    int var2 = 0;

    // read in user input
    printf("Enter index and value to write:");
    scanf("%i", var);
    scanf("%i", var2);

    // malicious user might set var to -1 and var2 to an address to execute
    // if say the 32-bit value before the stack variables is the instruction to
    // return to
    array[var] = var2

    // return now goes to malicious code
 }

(Итак, ваша задача состоит в том, чтобы построить код так, чтобы это было невозможно. :))

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

10
ответ дан 4 December 2019 в 19:34
поделиться

Если вы выделяете буфер в стеке, и он переполняется, он записывается в стек. Стек содержит указатель возврата для функции, выделившей буфер. Итак, если вы переполняете буфер в стеке, вы можете установить указатель возврата на что-нибудь произвольное; тем самым давая вам контроль над потоком выполнения.

Что касается фактического внедрения кода, это зависит от обстоятельств. Стек - или, скорее, страница, содержащая его, - часто запрещает выполнение кода; но исторически было возможно хранить небольшие вредоносные программы в самом буфере стека. Return-ориентированное программирование - это довольно новый вариант атаки return-to-libc , обе из которых работают с битами NX.

2
ответ дан 4 December 2019 в 19:34
поделиться

Типичный стек для каждой подпрограммы может выглядеть так:

0
ответ дан 4 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: