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