内核级病毒与木马攻防:ELF文件的符号表和函数调用追踪

熟悉编译原理的同学一定了解何为符号,所谓符号其实是一种数据结构,用来描述编程语言中定义的特定对象。例如编程语言中定义的变量,函数都有特定的符号用于描述他们的性质。例如变量对应的符号中包含了变量对应的字符串名称,变量的类型,以及变量对应的内存。函数对应的符号包含了函数名称字符串,函数的返回值类型,函数入口内存地址等,在代码调试时,你把鼠标挪动到变量所在位置,IDE就给你显示出变量当前的取值等信息,这些信息就来自变量对应的符号,我在有关编译原理的两门课程里对符号有非常深入的讲解。

在elf文件中存在两种符号表,分别为.dynsym和.symtab。.dynsym包含了外部链接进来的全局变量对应符号,例如当代码中使用printf函数时,该函数对应的符号就存储在.dynsym中。而.symtab包含了.dynsym中的所有符号,还包括了代码本地定义的变量和函数符号,既然后者已经包含前者的符号表,为何ELF文件格式依然要保持两张符号表呢,我们先用readelf -S来再次查看可执行文件的符号表段:readelf -S ./hello_world,在输出的结果中可以看到,有些段对应的flag是标志A,有些是WA,如下图:

在这里插入图片描述

其中A表示ALLOC,WA表示WRITE/ALLOC,AX表示ALLOC/EXEC,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Linux ELF(可执行与可链接格式)中,有两个相关的符号表:静态符号表和动态符号表。它们与程序运行时的函数符号表有以下关系: 1. 静态符号表:静态符号表是在编译时由编译器创建的一张符号表,它包含了可执行文件中的所有符号信息,包括函数、全局变量、局部变量等。静态符号表记录了符号的名称、类型、地址等信息。它在链接过程中用于解析符号的引用关系,以确定符号的最终地址。 2. 动态符号表:动态符号表是在运行时由动态链接器(如 ld.so)创建的一张符号表,它包含了可执行文件中需要在运行时解析的动态符号信息,如共享库中的函数和变量。动态符号表记录了符号的名称、类型、地址等信息。它用于在程序运行时进行动态链接,将程序与共享库中的符号关联起来。 3. 函数符号表函数符号表是在程序运行时动态生成的,用于记录程序当前可见的函数符号及其地址。这个表主要由动态链接器和调试器使用,用于调试目的或者在运行时查找函数地址。 静态符号表和动态符号表都记录了程序中的符号信息,但它们的使用方式和目的略有不同。静态符号表用于链接过程,解析符号引用关系以确定符号的地址。动态符号表用于动态链接过程,在程序运行时将符号与共享库中的实际地址关联起来。函数符号表则是在程序运行时动态生成的,用于调试和查找函数地址。 需要注意的是,函数符号表是一个在运行时动态生成和维护的结构,它的具体实现可能会因操作系统、编译器、调试器等因素而有所不同。以上是一般情况下的概述,具体实现细节可能会有所差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值