# .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