Какая уязвимость в этом C-коде? - PullRequest
0 голосов
/ 05 января 2019

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

int
main(int argc, char **argv)
{
    (void) foo(argv[1]);
    exit(0);
}

int
foo(char *arg)
{
    return bar(arg);
}

int
bar(char *arg)
{
    char lbuf[1024];
    if (strlen(arg) >= 1024)
        return -1;

    memset(lbuf, 0, sizeof(lbuf));
    sprintf(lbuf, "%s", "Welcome: ");
    read(0, lbuf + strlen(lbuf), sizeof(lbuf) - strlen(lbuf) - 1);
    printf(lbuf);
    fflush(stdout);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Там вообще нет переполнения буфера. Но это не значит, что это безопасно.

Проблема, которую вы ожидаете найти, заключается в следующей строке:

printf(lbuf);

Когда вы предоставляете строку формата, убедитесь, что она находится под вашим контролем и запрашивает только те аргументы, которые вы указали. Доступ к не предоставленным аргументам или неправильному типу приводит к неопределенному поведению (могут происходить все виды странных и потенциально опасных вещей). Кроме того, можно использовать %n, чтобы ткнуть в память, что более опасно.
В этом случае lbuf содержит Welcome:, за которым следует произвольный небезопасный ввод пользователя.

Кроме того, программа безоговорочно читает argv[1] (допущение argc > 0) и далее предполагает, что она указывает на строку (предположение argc > 1) при передаче ее в strlen().

0 голосов
/ 05 января 2019

Ваш код - это просто UB без каких-либо возможных взломов (если мы рассмотрим только переполнение буфера и проанализируем любые другие возможные).

Переполнение буфера для использования атакующая техника должна перезаписать некоторые данные, использованные позже в программе. Это может быть изменение переменных или размещение некоторого кода (менее распространенного, но возможного)

пример:

#include <stdio.h>
#include <string.h>

int CheckPassword(void)
{
    char passwd[5];
    int passwordcorect = 0;

    printf("Enter password:");
    gets(passwd);

    if(!strcmp(passwd, "1234"))
    {
        passwordcorect = 1;
    }
    return passwordcorect;
}

int main()
{
    if(CheckPassword())
    {
        printf("\nSpecial priviledges granted!!\n");
    }
    else
    {
        printf("\nWrong!!\n");
    }
    return 0;
}

Составлено с помощью mingw. enter image description here

И результат:

enter image description here enter image description here

Почему это случилось? Поскольку буфер перезаписал переменную passwordcorrect. Это связано с системой, реализацией и т. Д., Но взлом не является чем-то абстрактным или переносимым:)

...