_dl_open в ld-2.13.so вызывается - PullRequest
0 голосов
/ 31 марта 2011

Я хотел бы вызвать функцию _dl_open из ld-2.13.so.Я получаю смещение этой функции из objdump, а затем добавляю его в начальный адрес библиотеки, чтобы получить адрес функции.Затем я присоединяюсь к процессу с помощью ptrace и внедряю свой собственный двоичный код, в котором:

  • Я помещаю в регистр eax адрес пути библиотеки.
  • Я кладу в ebx RLTD_LAZY
  • Я положил в ecx NULL (это вызывающая сторона, но я не понимаю, что на самом деле).

Затем я вызываю функцию (адрес которой рассчитан правильно) и получаю... ничего :) Библиотека не вводится и у меня нет вывода.Я нашел в ld-2.13.so также функцию _dl_open_worker, которая при вызове выдает:

. / Process: ошибка при загрузке общих библиотек: dlopen: недопустимый вызывающий объект

Что я делаю неправильно?

Все, что я сделал, было основано на: http://nologin.org/Downloads/Papers/remote-library-injection.pdf

Заранее благодарен за любую помощь.

Ответы [ 3 ]

2 голосов
/ 30 сентября 2011

Вы можете сделать это, используя «hotpatch» от https://github.com/vikasnkumar/hotpatch

Код делает все, что вам нужно сделать. Он обрабатывает относительную адресацию. Все еще нужно выяснить часть _dl_open, но это должно быть сделано через пару дней.

Работает для 64-битной скважины.

1 голос
/ 31 марта 2011

Linux использует рандомизацию размещения адресного пространства (ASLR), чтобы предотвратить атаки удаленного переполнения буфера, которые делают именно то, о чем вы говорите.

Задавая подобные вопросы, я настоятельно рекомендую вам описать вашу законную потребность в информации.Таким образом, пользователи не собираются оказывать большую помощь в явно незаконных действиях.

0 голосов
/ 14 августа 2014

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

Проблема заключалась в попытке поместить значение mode / flags в ebx, когда оно должно было быть помещено в edx. В следующей статье описывается, как вызывать _dl_open вручную в контексте внедрения библиотеки:

http://www.ars -informatica.com / Root / Код / 2010_04_18 / LinuxPTrace.aspx

Они определяют _dl_open как:

void * 
internal_function 
_dl_open(const char *file, int mode, const void *caller);

Хотя символ экспортируется libc, он все еще определяется как внутренняя функция, то есть его параметры передаются через регистры следующим образом:

EAX = const char *file
ECX = const void *caller
EDX = int mode
...