2015-01-20 4 views
2

Я переживаю «взлом: искусство эксплуатации» и следуя примерам. На странице 145 автор демонстрирует, как использовать программу notesearch.c с шеллкодеком, хранящимся в переменной среды. Эриксон делает это следующим:Exploit работает в gdb, но не в командной строке

./notesearch $ (Perl -e 'печать "\ x47 \ xf9 \ XFF \ XBF" x40')

В командной строке, это Безразлично» т работа для меня, но в GDB, введя

запустить $ (Perl -e 'печать "\ x47 \ xf9 \ XFF \ XBF" x40')

работает.

Примечания: Теперь его адрес выше, чем мой адрес, из-за защиты в ЦП, но я только что последовал его примеру, запустив заметки в gdb, получив адрес шеллкода в переменной окружения, добавив 100 к нему:

(GDB) х/s 0xbffff8e3 + 100

конечно мой адрес отличается от его выше, но все же, все проверили, но это не сработало.

**** НО ****

Когда я запускаю свой код эксплойта в GDB, он отлично работает.

запустить $ (Perl -e 'печать "\ x47 \ xf9 \ XFF \ XBF" x40')

Так почему бы

запустить $ (Perl -e «печать«\ x47 \ xf9 \ XFF \ XBF "x40')

работы в БГД, и дайте мне корневую оболочку, но

./notesearch $ (Perl -e«печать «\ x47 \ xf9 \ XFF \ xbf "x40 ')

в командной строке не будет работать? Является ли рандомизация адреса отключена в gdb, но не в ОС? Существует ли несоответствие между адресами, которые показывает GDB и с какими адресами работает программа? Заранее благодарю за любое руководство.

+0

Я предполагаю, что функция ранжирования адресов работает здесь, как в GDB, так и в ОС.Адреса рандомизированы для каждого запуска программы, поэтому адрес в независимом прогоне программы не будет соответствовать тому, который вы ранее извлекли, используя GDB. –

+0

Спасибо, Джонас, я боялся этого. Это будет хорошим упражнением для меня, но для других, кто борется, он ДЕЙСТВИТЕЛЬНО смешивает воды, когда демонстрационный эксплойт не работает, как описано, особенно когда VM и код предоставляются. Дело закрыто с моей точки зрения. – user1197457

+0

Как сказано, это просто догадка (вот почему я не дал никакого ответа), и могут быть другие причины такого поведения. Кто-то, у кого есть доказательства и/или опыт, может сделать окончательное заявление по этому поводу. –

ответ

0

Нам не нужно рисовать на ASLR, чтобы объяснить, почему Exploit работает в gdb, но не в командной строке. При запуске в GDB местоположение стека просто сдвигается немного (в моей системе - 80 байт), поэтому предоставленный адрес 0xbffff947 должен быть настроен для работы из командной строки оболочки. Чтобы убедиться в этом, просто взгляните, положив e. г.

printf("searchstring = %p\n", searchstring); 

в notesearch.c; вы можете увидеть постоянный адрес каждый раз, когда вы запускаете команду из оболочки, и другой постоянный адрес при каждом запуске из GDB.