Формат строковой атаки в C - PullRequest
       48

Формат строковой атаки в C

2 голосов
/ 16 августа 2011

Я изучаю подразделение безопасности и пытаюсь понять атаки форматной строки. Может ли кто-нибудь попытаться объяснить это мне?

Следующий код взят из: http://julianor.tripod.com/bc/tn-usfs.pdf:

/*
 * fmtme.c
 *       Format a value into a fixed-size buffer
 */
#include <stdio.h>
int
main(int argc, char **argv)
{
    char buf[100];
    int x;
    if(argc != 2)
        exit(1);
    x = 1;
    snprintf(buf, sizeof buf, argv[1]);
    buf[sizeof buf - 1] = 0;
    printf("buffer (%d): %s\n", strlen(buf), buf);
    printf("x is %d/%#x (@ %p)\n", x, x, &x);
    return 0;
}

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

В документе представлен следующий пример:

perl -e 'system "./fmtme", "\x58\x74\x04\x08%d%n"'

Откуда взялся \x58\x74\x04\x08%d%n? 1015 *

1 Ответ

3 голосов
/ 16 августа 2011

"\ x58 \ x74 \ x04 \ x08% d% n" - это "код оболочки".

В этом документе очень подробно объясняется эксплойт. Я предполагаю, что вы ожидаете некоторого понимания типичной компоновки кадров стека, что также объясняется в таблице. Имейте в виду, что адреса стеков обычно растут вниз, что означает, что вызов функции, который «выталкивает» больше аргументов, чем было фактически передано ему, начнет читать локальные переменные из фрейма стека ниже своего собственного. Это то, что использует этот шелл-код.

Он помещает адрес в первые 4 байта buf (потому что snprintf печатает его там), а затем пропускает переменную x (из кадра под ним) и, наконец, считывает адрес из первой части buf (но интерпретируется как указатель) и записать в него значение через код формата% n.

...