Skip to content

So文件Section修复思路

freakishfox edited this page May 12, 2017 · 2 revisions

So文件Section修复思路

为什么要修复Section?

  • Section信息对IDA等相关静态分析工具的分析效果起到至关重要的作用
  • 异常的Section信息会进一步引发静态分析工具报错或者中断加载和分析
  • 错误的Section信息会引导静态分析工具向不可预知的方向进行分析,结果也是不可预期的

哪些情况会导致Section信息破坏?

  • So文件经过strip工具处理
  • So文件被加固,加固工具刻意删除Section信息
  • So文件是从内存中dump出来的,不包含有效的Section信息

修复思路

修复思路一
  • 总体思路:认为文件中现存的Section信息全部无效,依赖Program Header中的 dynamic节中的数据进行修复
  • 修复步骤:
    • 从Program Header Table中查找所有类型为PT_LOAD的Segment, 然后分别记录每个PT _LOAD节的Virtual地址和文件Offset

    • 从Program Header Table中遍历类型为PT_DYNAMIC的Segment, 按照这个节中每个Elf32 _Dyn中的Tag类型,加载如下几种类型的信息:

      1. DT_SYMTAB
      2. DT_STRTAB
      3. DT_STRSZ
      4. DT_REL
      5. DT_RELSZ
      6. DT_JMPREL
      7. DT_PLTRELSZ
      8. DT_INIT _ARRAY
      9. DT_INIT _ARRAY _SZ
      10. DT_FINI _ARRAY
      11. DT_FINI _ARRAY _SZ
    • 使用上一步骤中的信息,初步建立Section内容雏形,目前缺少Offset的数据项,根据步骤1中获取的Virutal地址,确定刚刚建立的每个Section雏形属于哪个Load段,使用这个Load段的 Virutal - Offset + Section(Virtual)来进行Section(Offset)修复

    • 修复每个Section的名称字段的StrTab序号

      1. 如果StrTab中有则复用序号
      2. 如果没有则自建字符串
    • Section数据回填

      1. 把section数据组合成数组转换成二进制流添加到文件最后
      2. 修正Elf文件头相关字段