“剥离二进制显示”_cxa“U最终确定”;而不是",;libc“启动”主菜单;
为什么剥离二进制显示的是“剥离二进制显示”_cxa“U最终确定”;而不是",;libc“启动”主菜单;,c,gdb,disassembly,strip,objdump,C,Gdb,Disassembly,Strip,Objdump,为什么剥离二进制显示的是\u cxa\u finalize而不是libc\u start\u main 我试图在Linux(Ubuntu)上的一个非常简单的C程序中找到并反汇编main()。二进制文件被剥离。下面您可以看到相同说明的拆卸(未剥离)与拆卸(剥离) 问题:剥离版本中的\u cxa\u finalize是什么?为什么将libc\u start\u main替换为\u cxa\u finalize 未剥离: 106d: 48 8d 3d c1 00 00 00 lea r
\u cxa\u finalize
而不是libc\u start\u main
我试图在Linux(Ubuntu)上的一个非常简单的C程序中找到并反汇编main()。二进制文件被剥离。下面您可以看到相同说明的拆卸(未剥离)与拆卸(剥离)
问题:剥离版本中的\u cxa\u finalize
是什么?为什么将libc\u start\u main
替换为\u cxa\u 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 lea rdi,[rip+0xc1]#1135
1074:ff 15 66 2f 00 00呼叫QWORD PTR[rip+0x2f66]#3fe0
剥夺:
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>
106d:48 8d 3d c1 00 lea rdi,[rip+0xc1]#1135
1074:ff 15 66 2f 00 00呼叫QWORD PTR[rip+0x2f66]#3fe0
它不是\uuucxa\ufinalize
。它是\ucxa_finalize@plt+0xf5
和\ucxa_finalize@plt+0x2fa0
(注意重要的偏移量)。因为您删除了符号表,所以反汇编程序没有关于符号main
或\uu libc\u start\u main
的信息,但出于技术原因,它仍然知道与PLT thunks关联的符号(因为在动态链接时绑定需要它们,而反汇编程序在缺少s符号表时可能会返回使用该信息)。一般来说,反汇编程序从一个地址向后工作,直到找到一个以符号命名的地址,并假定(这里是错误的)正在反汇编的地址是该函数的一部分。为什么这个剥离二进制文件的示例仍然有_libc_start_main?0x000000000040464:callq 0x400428@Harry:它不是\u libc_start_main
。它是\u libc_start_main_main@plt
,提供定义的PLT thunk,对于完全相同的r是可见的eason as\uuucxa_finalize@plt
:对应于PLT thunk的GOT插槽有一个动态重新定位,没有它,动态链接将不可能。如果您使用静态链接和剥离,您将看到它不存在。