【问题标题】:Stripped binary shows "_cxa_finalize" instead of "libc_start_main"剥离的二进制文件显示“_cxa_finalize”而不是“libc_start_main”
【发布时间】:2019-08-20 02:14:26
【问题描述】:

为什么剥离的二进制显示 _cxa_finalize 而不是 libc_start_main

我正在尝试在 Linux (Ubuntu) 上的一个非常简单的 C 程序中定位和反汇编 main()。二进制文件被剥离。您可以在下面看到相同说明的反汇编(未剥离)与反汇编(剥离)。

问题:剥离版本中的_cxa_finalize 是什么?为什么libc_start_main_cxa_finalize代替了?

未剥离:

106d:   48 8d 3d c1 00 00 00    lea    rdi,[rip+0xc1]        # 1135 <main>

1074:   ff 15 66 2f 00 00       call   QWORD PTR [rip+0x2f66]        # 3fe0 <__libc_start_main@GLIBC_2.2.5>

剥离:

106d:   48 8d 3d c1 00 00 00    lea    rdi,[rip+0xc1]        # 1135 <__cxa_finalize@plt+0xf5>

1074:   ff 15 66 2f 00 00       call   QWORD PTR [rip+0x2f66]        # 3fe0 <__cxa_finalize@plt+0x2fa0>

【问题讨论】:

    标签: c gdb disassembly strip objdump


    【解决方案1】:

    不是__cxa_finalize。它是__cxa_finalize@plt+0xf5__cxa_finalize@plt+0x2fa0(注意重要的偏移量)。反汇编程序没有关于符号 main__libc_start_main 的信息,因为您删除了符号表,但由于技术原因,它仍然知道与 PLT thunk 关联的符号(因为在动态链接时绑定需要它们,并且反汇编程序在缺少符号表时可能会退回使用该信息)。一般来说,反汇编器从一个地址向后工作,直到找到一个由符号命名的地址,并假设(在这里错误地)被反汇编的地址是该函数的一部分。

    【讨论】:

    • 为什么这个剥离二进制文件的例子仍然有 _libc_start_main??stackoverflow.com/questions/5475790/… 0x0000000000400464: callq 0x400428 <__libc_start_main>
    • @Harry:不是__libc_start_main。它是__libc_start_main@plt,PLT thunk 将提供定义,它可见的原因与__cxa_finalize@plt 完全相同:对应于该PLT thunk 的GOT 插槽有一个动态重定位,没有它就不可能进行动态链接。如果你静态链接和剥离,你会发现它不存在。
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2013-04-05
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多