Stack Overflow (Справочник шеллкодера)

В настоящее время я слежу за исправлениями в Руководстве по шеллкодеру (2-е издание ). Книга немного устарела, но все равно хороша. Моя проблема сейчас в том, что я не могу угадать, как долго должна быть моя полезная нагрузка. Я пытался следовать каждому шагу (и запускать gdb с теми же аргументами), и я пытался угадать, где начинается буфер, но я точно не знаю . Я тоже новичок в этом, так что это имеет смысл.

У меня есть уязвимая программа с strcpy() и buffer[512]. Я хочу сделать так, чтобы стек переполнялся, поэтому я выполняю некоторые A с программой (например, опечатки для справочника шеллкодеров). Я хочу узнать, какой длины должна быть полезная нагрузка (без ASLR), поэтому теоретически мне просто нужно найти, где находится буфер.

Поскольку я новичок, я не могу опубликовать изображение, но предпочтительный вывод из книги имеет полные 4 строки «А» (0x41414141), и мой выглядит так:

(gdb) x/20xw $esp - 532         
0xbffff968 : 0x0000000  0xbfffffa0e 0x41414141 0x41414141
0xbffff968   0x41414141 0x41414141  0x00004141 0x0804834

Какой это адрес? Как я узнаю, где начинается этот буфер? Я хочу сделать это, чтобы продолжить работу над книгой. Я понимаю, что буфер находится где-то там из-за пятерок, которые я пробежал. Но если я хочу узнать, какой длины должна быть полезная нагрузка, мне нужна точка, с которой она начинается.


person wiz    schedule 26.09.2015    source источник
comment
Вы можете загрузить изображение в imgur и поделиться здесь.   -  person a3.14_Infinity    schedule 26.09.2015


Ответы (2)


Я не уверен, что вы правильно скопировали вывод gdb. Вы использовали команду x/20xw, это говорит о том, что вы хотите проверить 20 32-битных слов памяти, отображаемых в шестнадцатеричном виде. Таким образом, каждый элемент отображаемых данных должен состоять из 0x, за которыми следуют 8 символов. У вас есть некоторые только с 7, а некоторые с 9. Я предполагаю, что вы скопировали текст от руки и сделали несколько ошибок.

Адрес — это первый элемент, отображаемый в строке, поэтому для первой строки адрес равен 0xbffff968, это адрес первого байта в строке. Оттуда вы можете вычислить адрес каждого второго байта в строке путем подсчета.

Ваша вторая строка выглядит немного запутанной, у вас тот же адрес, а также вам не хватает символа :, опять же, я предполагаю, что это просто результат копирования. Я ожидаю, что адрес второй строки будет 0xbffff978.

Если буфер начинается с первого слова 0x41414141, то это адрес 0xbffff970, хотя более простой способ узнать адрес переменной — просто запросить у gdb адрес переменной, поэтому в вашем случае, как только gdb остановился в месте, где buffer находится в области видимости:

(gdb) p &buffer
$1 = (char (*)[512]) 0xbffff970
person Andrew    schedule 26.09.2015

В Metasploit есть хороший инструмент для расчета смещения. Он сгенерирует строку, содержащую уникальные шаблоны. Используя этот шаблон (и значение EIP или любое другое место после использования шаблона), вы можете увидеть, насколько большим должен быть буфер для записи точно в EIP или любое другое место.

Откройте папку инструментов в папке metasploit framework3 (я использую версию metasploit 3 для Linux). Вы должны найти инструмент под названием pattern_create.rb. Создайте шаблон из 5000 символов и запишите его в файл:

root@bt:/pentest/exploits/framework3/tools# ./pattern_create.rb
Usage: pattern_create.rb length [set a] [set b] [set c]
root@bt:/pentest/exploits/framework3/tools# ./pattern_create.rb 5000 

Затем просто замените A на результат работы инструмента. Запустите приложение и подождите, пока приложение снова не остановится, и обратите внимание на содержимое EIP или любого другого места. Затем используйте второй инструмент metasploit, чтобы вычислить точную длину буфера перед записью в EIP или любое другое место, введите в него значение EIP или любое другое место (на основе файла шаблона) и длину буфера:

root@bt:/pentest/exploits/framework3/tools# ./pattern_offset.rb 0x356b4234 5000
1094
root@bt:/pentest/exploits/framework3/tools#
  1. Это длина буфера, необходимая для перезаписи EIP или любого другого места.
person Dy Coder    schedule 01.10.2015