Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“剥离二进制显示”_cxa“U最终确定”;而不是",;libc“启动”主菜单;_C_Gdb_Disassembly_Strip_Objdump - Fatal编程技术网

“剥离二进制显示”_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插槽有一个动态重新定位,没有它,动态链接将不可能。如果您使用静态链接和剥离,您将看到它不存在。