我发现ELF可执行文件/库的符号表(binding=LOCAL)中存在带有visibility=HIDDEN.symtab的符号。他们需要什么?它们不参与重定位过程,也不能在外部调用。它们是否包含在符号表中以进行异常处理?

评论

这不完全是一个RE问题...

#1 楼

符号绑定和符号可见性


它们需要什么?


链接编辑器(ld)必须有一种方法来确定链接时符号的范围。换句话说,符号绑定使链接编辑器可以区分仅在链接的特定文件(本地范围)内可见的符号和可以从其他文件(全局范围)中的函数中引用的符号。符号可见性属性(默认,保护,隐藏或内部)对于运行时(动态)链接器(ld-linux.so.*)具有特殊含义,告诉它可执行文件内部使用了符号表中的哪些符号,而哪些符号可能是由程序运行时动态链接到它的其他可执行文件使用。

来自为什么符号可见性很好: 。
第一个概念是符号绑定。全局绑定意味着
符号在正在生成的文件外部可见;
相反,局部绑定使符号仅局部(静态),而弱符号则像
全局一样,但表明该符号可以被覆盖。

这很好并且很好,但是当您要加载许多不同的模块并保留严格的API(例如动态库!)时,它开始崩溃。但这不是完整的解决方案。

为了解决这个问题,ELF提供了可见性属性。符号可以是默认,受保护,隐藏或内部的。使用这些属性,我们可以为动态加载程序标记额外的信息,以便它可以知道哪些符号供公众使用,哪些符号仅供内部使用。默认情况下,所有符号都用-fvisibility=hidden隐藏,然后为要显示的符号“在墙上打孔”。


符号和重定位


它们不参与重定位过程


,这是错误的。

来自系统V ABI Edition 4.1(通用),第4章:目标文件,重定位:重定位是使用
符号定义连接符号引用的过程。例如,当程序调用函数时,关联的调用指令必须在执行时将控制权转移到正确的目标地址。


从Oracle Linker和库指南,第一部分:使用链接编辑器和运行时链接器,第2节:链接编辑器符号处理:在输入文件处理期间,来自输入的所有本地符号
可重定位的对象将传递到输出文件图像。输入可重定位对象中的所有
全局符号,以及共享对象相关性中的
全局符号,都在链接编辑器内部内部累积。


符号和程序运行时


也不能从外部调用它们


在程序运行时从不调用符号。在运行期间,CPU中的指令指针跳到位于链接编辑器计算的偏移量处的指令虚拟内存中的内存地址(重定位)。如果符号在运行时相关,则无法从可执行二进制文件中删除(剥离)符号表。

评论


这是一个很糟糕的答案。爱的链接。

–埃文·卡洛尔(Evan Carroll)
18-10-2在0:24

@EvanCarroll谢谢,我很高兴您发现它很有用。

– julian♦
'18 -10-2在0:28

我喜欢您大多数的东西@SYS_V。您对[re.se]的贡献常常超出职责范围。保持良好的工作状态,互连网上至少要有一个风扇。

–埃文·卡洛尔(Evan Carroll)
18年2月2日,0:31

@EvanCarroll非常感谢。我期待阅读您使用r2的CTF文章

– julian♦
18-10-2在0:35

我学到很多东西。一直保持谦虚和消耗到这个水平。但是在社区中拥有所有重要人物真的很酷。您可以使用逆向工程做任何事情,MegaBeet,SYS_V,Peter Cordes和Stephen Kitt之类的名字似乎垄断了Google以及我所寻找的东西。

–埃文·卡洛尔(Evan Carroll)
18-10-2在0:41