#c #stack-overflow
#c #переполнение стека
Вопрос:
Я пытаюсь изучить переполнение стека, но у меня проблема с упражнением. В уязвимой программе часть кода, которая должна получить мой шелл-код, является:
int array[8];
index = (int) strtol(argv[1], NULL, 10);
value = (int) strtoul(argv[2], NULL, 16);
array[index] = value;
Я легко нашел индекс массива, который нужно использовать для перезаписи RET. Затем я попытался найти смещение обратного адреса в уязвимой программе следующим образом:
./victim 12 $(printf "12x" 0)
Я перепробовал много разных длин, но при каждой возможной длине я получаю ошибку сегментации. Это странно, потому что в моей книге говорится, что я должен быть в состоянии получить ошибку сегментации только там, где есть сохраненный обратный адрес.
Я новичок, поэтому, вероятно, я совершаю какую-то основную ошибку. Кто-нибудь может помочь мне решить эту проблему?
Заранее спасибо за любую помощь.
Комментарии:
1. На какую книгу вы ссылаетесь?
2. Кроме того, почему длина входной строки имеет какое-либо отношение к этому?
strtol
всегда будет интерпретировать это как0
.3. Книга представляет собой «Руководство по шеллкодированию» Энли, Хисмана, Линднера, Ричарта. Я нашел в книге указание попробовать разные длины, чтобы найти смещение, но если строка всегда будет интерпретироваться как 0, как я могу обойти эту проблему?
4. Происходит что-то еще, чего вы нам не показываете. Если вы создаете простой main(), который выполняет только тот код, который вы показываете, он не создает дамп ядра. Покажите минимально полную программу, которая надежно приводит к сбою. Запустите его в gdb и получите обратную трассировку (например,
gdb ./victim corefile
, затем запуститеbt
).
Ответ №1:
Вы получаете ошибку сегментации, потому что вы предоставляете своей программе только один аргумент, но все же вы вызываете strtoul
on argv[2]
, который является NULL
указателем.
Комментарии:
1. В сообщении была ошибка, когда я пробовал упражнение, я использовал два аргумента. Я отредактировал сообщение, и теперь оно правильное.