Упражнение о переполнении стека

#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. В сообщении была ошибка, когда я пробовал упражнение, я использовал два аргумента. Я отредактировал сообщение, и теперь оно правильное.