【问题标题】:Finding the rendezvous (struct r_debug) structure of a process?寻找进程的集合点(struct r_debug)结构?
【发布时间】:2019-09-02 17:06:44
【问题描述】:

我正在尝试访问“集合结构”(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 步,因为 PT_DYNAMIC 的 vaddr 段总是指向一个无效的地址。

我做错了什么?我需要找到 vaddr 的搬迁吗? 我查看了 LLDB 来源,但无法弄清楚他们是如何获得地址的。

更新:@EmployedRussian 是对的,我正在查看与位置无关的可执行文件。 他计算搬迁的解决方案非常有效。

【问题讨论】:

  • 我相信包含您的代码的 sn-p 和您收到的错误消息将有助于大大改善问题。

标签: c linux debugging elf debug-symbols


【解决方案1】:

我做错了什么?

您很可能正在查看与位置无关的可执行文件。如果你的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 值和Phdr_pt_phdr.p_vaddr 之间找到此重定位地址。

(上面我使用Phdr_xxx 作为Phdr[j].p_type == xxx 的简写)。

您还可以采用比您必须的方式更复杂的方式来执行此操作:动态数组的地址可以简单地以_DYNAMIC[] 的形式获得。见this answer

【讨论】:

  • 我无法使用 _DYNAMIC,因为我正在从远程进程获取动态数组。
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2010-09-21
相关资源
最近更新 更多