1

我有一个x86-64可执行文件,我正在尝试使用静态方法对其进行分析。从开始_start,我看到一个跳转到-包含指令的 - 中0x400648的地址。这种跳跃导致,其实就是这样。这让我们回到并执行。PLTjmp *0x20065a(%rip)*0x600ca80x40064ePLTpushq $0x2

这就是我卡住的地方:我知道pushq $0x2存在告诉动态链接器解析表中的第三个条目的指令.dynsym。问题是该st_value条目中的字段是0x0. 这个值实际上应该是 from 的偏移量main_start对吧?如果是这样,该字段如何st_value初始化?

4

1 回答 1

1

这个值实际上应该是 main 与 _start 的偏移量,对吧?

错误的。您不能只是从 to 跳转_startmain-- 后者期望argcargv[]参数,但还没有人设置它们。libc初始化代码的工作是:

  • 初始化 libc 本身,创建标准FILE句柄(stdout等),设置环境等,以及
  • 使用正确的参数调用main,并且
  • 如果/当main返回时,安排程序exit(2)使用正确的退出代码。

您所看到的实际上是对 的PLT调用__libc_start_main,它将执行上述所有操作,然后调用main。您可以使用 来查看objdump -dr a.out,它看起来类似于:

00000000004003d0 <_start>:
  4003d0:       31 ed                   xor    %ebp,%ebp
  4003d2:       49 89 d1                mov    %rdx,%r9
  4003d5:       5e                      pop    %rsi
  4003d6:       48 89 e2                mov    %rsp,%rdx
  4003d9:       48 83 e4 f0             and    $0xfffffffffffffff0,%rsp
  4003dd:       50                      push   %rax
  4003de:       54                      push   %rsp
  4003df:       49 c7 c0 50 05 40 00    mov    $0x400550,%r8
  4003e6:       48 c7 c1 c0 04 40 00    mov    $0x4004c0,%rcx
  4003ed:       48 c7 c7 b4 04 40 00    mov    $0x4004b4,%rdi
  4003f4:       e8 c7 ff ff ff          callq  4003c0 <__libc_start_main@plt>
  4003f9:       f4                      hlt
  4003fa:       90                      nop
  4003fb:       90                      nop

st_value 字段如何初始化?

您可以在此处阅读有关动态符号解析如何工作的实际详细信息(搜索“过程链接表”;请注意:很少有人真正了解它的详细工作原理)。

于 2013-07-21T19:02:35.467 回答