Перехват библиотечных функций libc.

Тема в разделе "WASM.UNIX", создана пользователем andrewiv, 11 мар 2011.

  1. andrewiv

    andrewiv New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2011
    Сообщения:
    1
    как можно подменить вызов функции используя ptrace. Насколько мне известно с elf подгружается секция .got в которой хранятся адреса библиотечных функций. как её найти? и куда имеет смысл записать свой код.
    Стоит ли так делать?:
    скопировать себе старый код. вставить код c mmap увеличивающий размер памяти, вернуть старый код. добавить в новый выделенный кусок свой код.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    я думаю проще всего заинжектить .so, и уже в нем сделать все необходимые перехваты... как инжектить .so можно прочитать на phrack... кстати вопрос в тему... есть ли какой-нить способ из .so-библиотеки узнать базовый адрес, по которому был замаппен elf-файл процесса? (кроме парсинга /proc/self/maps)... адреса функций можно по программному заголовку поискать...
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    andrewiv
    Гораздо проще сделать это через LD_PRELOAD.

    Rel
    Я сейчас не помню деталей, но эта ф-ия должна помочь.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    для легитимных проектов да)) для других - слишком известная и палевная тема)) в рантайме это интереснее делать, но канеш ptrace тоже уже давно и широко известна))

    да... я в принципе и сам могу по списку загрузщика прогуляться, в этом нет ничего сложного... я не так давно делал вызов функции из шареного объекта по хешу её имени, там примерно тоже самое... но как до этого списка добраться? я начинал парсинг с элф-заголовков по базовому адресу и дальше по структурам... на тот момент просто захардкодил базовый адрес... спасибо, посмотрю исходники из какой-нить glibc или dietlib через пару дней, пока нет доступа к линуксовой тачке)))
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Rel
    Не совсем понял, в чем именно заключается проблема прогуляться по списку загрузчика? Опять же, я сейчас не помню всех деталей, но суть в том, что при загрузке библиотеки, вызвавший код получает что-то типа HANDLE, который по сути является адресом структуры, описывающей загруженный объект. Этот же адрес можно найти в GOT. Объекты связаны двунаправленным списком, по которому можно довольно легко гулять. Для glibc 2.9 структура находится в файле glibc-2.9\include\link.h, называется link_map. Ее 'light' версия, которую, вероятно, можно получить с помощью какого-то вызова, можно найти в файле glibc-2.9\elf\link.h. В обеих версиях есть необходимые для обхода цепочки члены:

    Код (Text):
    1.     ElfW(Addr) l_addr;      /* Base address shared object is loaded at.  */
    2.     char *l_name;       /* Absolute file name object was found in.  */
    3.     ElfW(Dyn) *l_ld;        /* Dynamic section of the shared object.  */
    4.     struct link_map *l_next, *l_prev; /* Chain of loaded objects.  */