Переполнение буфера - программа завершается после появления оболочки

Я экспериментировал с переполнением буфера в системе FreeBSD. В качестве первого эксперимента я попытался заставить эксплуатируемую программу запустить другой процесс (в данном случае / bin / hostname). Это все работало нормально, программа напечатала имя хоста и затем прервалась. После этого я попытался заставить программу порождать оболочку (т.е. выполнять /bin/sh). Я предположил, что это можно сделать, просто заменив строку, представляющую вызываемую программу. Когда я пытаюсь это сделать, эксплуатируемая программа просто завершает работу, в соответствии с GDB она успешно создает новый процесс (/bin/sh). Тем не менее, оболочка не создается. Затем я попробовал свой первый эксплойт и переместил файл / bin / sh в / bin / hostname, но ничего не изменилось. Теперь у меня вопрос: что отличается от выполнения / bin / sh от любой другой команды?

Для справки, для попытки порождения оболочки я использовал следующий шелл-код:

char code[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68"
"\x68\x2f\x62\x69\x6e\x89\xe3\x50"
"\x54\x53\xb0\x3b\x50\xcd\x80";

1 ответ

Ха, я понимаю, что вы имеете в виду, но я верю, что вы делаете одну фундаментальную ошибку. Вы вызываете интерактивную оболочку, не привязывая ее.

Это похоже на вызов команды ifconfig. Если вы хотите выполнить одну команду, то ваш код оболочки идеален, однако если вы хотите интерактивную оболочку, вы не можете просто запустить sh.

Простое выполнение sh вызовет выполнение оболочки, но не даст вам интерактивного контроля над оболочкой.


Решение: Используйте генератор кода оболочки, чтобы создать обратную оболочку tcp или оболочку bind, и используйте ее в качестве полезной нагрузки для вашего эксплойта.

Если вы пытаетесь сделать это в Metasploit, то вот пример команды, которую вы хотите.

msfpayload windows/shell_bind_tcp LPORT=4444 R | msfencode -e x86/alpha_mixed -b '\x00' -t c
  • Msfpayload - это имя функции. windows/shell_bind_tcp - это путь эксплойта
  • LPORT - это порт, к которому удаленная машина-жертва будет иметь доступ к оболочке
  • R для сырой продукции
  • Затем мы передаем это в msfencode, так как нам нужно, чтобы он был C-кодом, чтобы быть исполняемым, и его нужно скомпилировать для этой архитектуры.
  • -e обозначает поддерживаемый тип кодировки и архитектуру, например, для Win Sp2
  • -b обозначает байты, которые вы не можете использовать в коде оболочки. Например, 00 - конец байта строки
  • -t это тип вывода, как C-код.

Исследуйте немного больше и поиграйте, и вы получите это. По сути, гораздо сложнее получить интерактивную оболочку по сравнению с выполнением статической команды.

После этого вы можете использовать программу типа netcat для подключения и использования оболочки.

netcat.exe -nv <victim ip> <port where shell was bound to>

Надеюсь, что это было правильное решение.

Другие вопросы по тегам