Как я могу выполнить атаку строки printf, используя переполнение буфера?

Код:

void doit()
{       
      system("/bin/sh");
      exit(0); 
}       

int main(int argc, char **argv)
{       
    static int the_var;
    char buf[512];

    the_var = 20;

    strncpy (buf, argv[1], sizeof(buf) - 1);

    printf (buf);

    if (the_var != 20)
    {
            doit();
    } else {
            printf ("\nthe_var @ 0x%08x = %d 0x%08x\n", &the_var, the_var, the_var);
    }
}

Программа работает с липким битом (uid владельца 0), все, что мне нужно сделать, это взломать его и запустить /bin/sh от имени пользователя root.

Я знаю, как взломать программу с помощью fe. переполнение буфера и strcpy (шеллкод), но не знаете, как использовать "атаку на строку формата" в этом случае.

Как видите, есть var the_var, если оно не равно 50, то шелл работает (может попробовать как-то изменить, какая-то грязная магия?). В любом случае есть printf (buf)


person makowiecki    schedule 17.06.2012    source источник


Ответы (1)


Вы контролируете buf. Передайте %x строки формата, чтобы выгрузить стек, и %n, чтобы перезаписать объект the_var в стеке. Из вашей программы, если объект the_var будет перезаписан, будет вызвана функция doit и выполнена /bin/sh.

person ouah    schedule 17.06.2012
comment
Спасибо за подсказку, это было просто. - person makowiecki; 17.06.2012