首页
社区
课程
招聘
[求助] Android so 重建中遇到的无法计算 .got 节起始位置!
发表于: 2018-10-7 04:42 2896

[求助] Android so 重建中遇到的无法计算 .got 节起始位置!

2018-10-7 04:42
2896
在分析一个壳的时候,发现它把so文件拆开了。只记录了一些必要信息,如:.dynstr;.dynsym;.init;.fini;.init_array;.fini_array;.hash;.rel.plt;.rel.dyn
现在我需要对这so进行重建,卡在不能只到.got节的起始。但是能通过 

_GLOBAL_OFFSET_TABLE_ 计算出 .got节的结束。一下是我对这so重建的部分代码:


    # .dynsym: ELF Symbol Table
    symtab_ = headerInfo.symtab_
    symtab_size_ = headerInfo.nchain_ * 0x10
    symtab_data_ = seg[0].data_[symtab_ : symtab_ + symtab_size_]

    # .dynstr: ELF String Table
    strtab_ = headerInfo.strtab_
    strtab_size_ = (headerInfo.bucket_-8) - headerInfo.strtab_
    strtab_data_ = seg[0].data_[strtab_ : strtab_ + strtab_size_]

    # .hash: ELF Hash Table
    nbucket_ = headerInfo.nbucket_
    nchain_ = headerInfo.nchain_
    bucket_ = headerInfo.bucket_
    chain_ = headerInfo.bucket_ + 4 * headerInfo.nbucket_
    bucket_data_ = seg[0].data_[bucket_ : bucket_ + nbucket_ * 4]
    chain_data_ = seg[0].data_[chain_ : chain_ + nchain_ * 4]

    # .rel.dyn: ELF REL Relocation Table
    rel_ = headerInfo.rel_
    rel_size_ = headerInfo.rel_count_ * 8
    rel_data_ = seg[0].data_[rel_ : rel_ + rel_size_]

    # .rel.plt: ELF JMPREL Relocation Table
    plt_rel_ = headerInfo.plt_rel_
    plt_rel_size_ = headerInfo.plt_rel_count_ * 8
    plt_rel_data_ = seg[0].data_[plt_rel_ : plt_rel_ + plt_rel_size_]

    # .plt: .plt 中的每一项和 .rel.plt 是一一对应的
    # size = .plt 第一项的大小 + .rel.plt数量 * 0xC
    plt_ = plt_rel_ + plt_rel_size_
    plt_size_ = 0x14 + headerInfo.plt_rel_count_ * 0xC
    plt_data_ = seg[0].data_[plt_ : plt_ + plt_size_]

    # .text: 第一个 Loadable Segment 包含: ELF头; 程序头; .dynsym; .dynstr; .hash; .rel.dyn; .rel.plt; .plt; .text; .ARM.exidx; .ARM.extab; .rodata
    # .text 以重定位代码而结束,特征码: "\x78\x47\xC0\x46\x00\xC0\x9F\xE5\x0F\xF0\x8C\xE0"
    # 因为无法定位 .ARM.exidx; .ARM.extab; .rodata 的位置,所以只能通过在第一个 Loadable Segment 中搜索特征码来定位 .text 的结束
    text_ = plt_ + plt_size_
    text_size_ = seg[0].data_.rfind("\x78\x47\xC0\x46\x00\xC0\x9F\xE5\x0F\xF0\x8C\xE0") - text_ + 0x10

    # .ARM.exidx; .ARM.extab; .rodata
    # 这三个节都没有办法定位,所以把他们合并到 .rodata 中去,无伤大雅。
    rodata_ = text_ + text_size_
    rodata_size = len(seg[0].data_) - rodata_

    # .fini_array
    fini_array_ = headerInfo.fini_array_
    fini_array_size_ = headerInfo.fini_array_count_ * 4

    # .init_array
    init_array_ = headerInfo.init_array_
    init_array_size = headerInfo.init_array_count_ * 4

    # .got
    # 可以通过 .plt 定位到 _GLOBAL_OFFSET_TABLE_;
    # _GLOBAL_OFFSET_TABLE_ 位于 .got 中;且 _GLOBAL_OFFSET_TABLE_ 前面是 .rel.dyn 重定位结构;后面是 .rel.plt 重定位结构;
    _GLOBAL_OFFSET_TABLE_ = plt_ + 0x10 + struct.unpack("<I", seg[0].data_[plt_ + 0x10 : plt_ + 0x14])[0]
    # got_ = ???? 不知道如何计算 .got 的起始
    got_end_ = _GLOBAL_OFFSET_TABLE_ + 0xC + headerInfo.plt_rel_count_ * 4
请求各位Elf大神提供一个思路,可以计算出.got的起始位置。感激不尽!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 129
活跃值: (432)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
对这so重建时,我先是手动重建。各个节的位置基本都是肉眼识别的。后面我想写一个脱壳工具,一方面可以自动化,一方面可以增强对ELF文件的认知。奈何卡到.got这里。在网上也没找到很好的解决方案。请求各位大神支支招吧。。
2018-10-7 04:52
0
雪    币: 1144
活跃值: (1344)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也卡在这里了,留个联系方式,交流交流
2018-10-8 16:15
0
游客
登录 | 注册 方可回帖
返回
//