Нахождение структуры свиданий (struct r_debug) процесса? - PullRequest
2 голосов
/ 12 апреля 2019

Я пытаюсь получить доступ к "структуре рандеву" (struct r_debug *), чтобы найти карту ссылок процесса.Но я продолжаю сталкиваться с недействительными адресами и действительно не могу понять, что происходит.

Вот как я продолжаю пытаться найти его:

1. Get the AT_PHDR value from the auxiliary vector
2. Go through the program headers until I find the PT_DYNAMIC segment
3. Try to access the vaddr of that segment (PT_DYNAMIC) to get the dynamic tags
4. Iterate through the dynamic tags until I find DT_DEBUG. If I get here I should be done

Проблема в том, что я могу 'Пройдите шаг 3, потому что vaddr сегмента PT_DYNAMIC всегда указывает на неверный адрес.

Что я делаю не так?Нужно ли найти перемещение vaddr?Я посмотрел источники LLDB, но не могу понять, как они получили адрес.

ОБНОВЛЕНИЕ: @EmployedRussian был прав, я искал независимый от позиции исполняемый файл.Его решение для расчета перемещения прекрасно сработало.

1 Ответ

1 голос
/ 12 апреля 2019

Что я делаю не так?

Скорее всего, вы смотрите на независимый от позиции исполняемый файл. Если ваш readelf -Wl a.out выглядит так:

Program Headers:
  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
  PHDR           0x000040 0x0000000000000040 0x0000000000000040 0x0001f8 0x0001f8 R   0x8
  INTERP         0x000238 0x0000000000000238 0x0000000000000238 0x00001c 0x00001c R   0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x000000 0x0000000000000000 0x0000000000000000 0x016d28 0x016d28 R E 0x200000
  LOAD           0x017250 0x0000000000217250 0x0000000000217250 0x0010d0 0x001290 RW  0x200000
  DYNAMIC        0x017df8 0x0000000000217df8 0x0000000000217df8 0x0001e0 0x0001e0 RW  0x8

, затем вам нужно настроить Phdr_pt_dynamic.p_vaddr по адресу перемещения исполняемого файла (ключ в том, что первый Phdr_pt_load.p_vaddr == 0).

Этот адрес перемещения можно найти как дельту между значением AT_PHDR в векторе aux и Phdr_pt_phdr.p_vaddr.

(Выше я использовал Phdr_xxx как сокращение для Phdr[j] с .p_type == xxx).

Вы также делаете это гораздо более сложным способом, чем нужно: адрес динамического массива тривиально доступен как _DYNAMIC[]. См. этот ответ .

...