Нет функции, содержащей программный счетчик для выбранного кадра - PullRequest
6 голосов
/ 20 ноября 2011

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

Вот часть значений памяти передвыполнение инструкции 'ret' программы, которую я хочу атаковать.

0x55683984:     0x5568398c   0x...(old r.a)      0x68e322a1      0x0000c31c
0x55683994:     0xf7fa9400      0x0804a3d7       0x556839c0      0xf7e518d0

На этом этапе все пошло не так, потому что он не может вытолкнуть стек и заставить% eip указать на выталкиваемое значение?Так что мой код сборки эксплойта не работает. (0x68e322a1 0x0000c31c) GDB говорит, что ни одна функция не содержит счетчик программ для выбранного кадра.и когда я пытаюсь выполнить его без отладки, это вызывает ошибку сегментации.

Эта проблема как-то связана с длиной моей сборки?(в данном случае это 6)?

Program received signal SIGSEGV, Segmentation fault.
0x5568398c in ?? ()
(gdb) x 0x5568398c
0x5568398c: 0x68e322a1

как это может произойти, когда я могу видеть, что находится внутри адреса, вызывающего segfault?

Ответы [ 2 ]

6 голосов
/ 19 мая 2013

По умолчанию disassemble выводит код текущей функции.В вашем случае программный счетчик указывает где-то в стеке, и GDB не поймет, где находятся границы текущей функции.Вот почему сообщение об ошибке.

Но вы можете вручную указать диапазон адресов для разборки:

(gdb) disassemble 0x7fffffffbb00,0x7fffffffbbff
4 голосов
/ 21 ноября 2011

Хорошо, вот история, которую я забыл поместить '$' перед адресом в инструкции movl в моем коде сборки.Таким образом, программа пыталась получить доступ к неопределенному адресу памяти, который вызывает ошибку сегментации.

Но мне не нравится, как GDB уведомляет эту ситуацию, говоря просто: «Нет функции, содержащей счетчик программы для выбранного кадра»

...