Да, довольно много подобных вопросов уже существует (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-байтовый пролог? Возможно, этот пример не самый простой из всех ...
Я смущаюсь. Есть идеи?
Действительно, поскольку аргументы 'printf' будут помещены в стек, адрес обратного адреса изменяется в соответствии с вашим вводом.Ваша строка формата должна, следовательно, «потреблять» столько же байтов, сколько и сама, плюс все остальное до адреса возврата. –
Не могли бы вы привести конкретный пример, предполагая, например, 50-байтовый шелл-код и никаких NOP? –
http://stackoverflow.com/questions/7459630/how-can-a-format-string-vulnerability-be-exploited –