如何解决ELF文件中的build-id数据偏移
我需要修改ELF注释部分的build-id
。我发现有可能here。还发现我可以做到by modifying this code。我不知道的是数据位置。这就是我在说的。
$ eu-readelf -S myelffile
Section Headers:
[Nr] Name Type Addr Off Size ES Flags Lk Inf Al
...
[ 2] .note.ABI-tag NOTE 000000000000028c 0000028c 00000020 0 A 0 0 4
[ 3] .note.gnu.build-id NOTE 00000000000002ac 000002ac 00000024 0 A 0 0 4
...
$ eu-readelf -n myelffile
Note section [ 2] '.note.ABI-tag' of 32 bytes at offset 0x28c:
Owner Data size Type
GNU 16 GNU_ABI_TAG
OS: Linux,ABI: 3.14.0
Note section [ 3] '.note.gnu.build-id' of 36 bytes at offset 0x2ac:
Owner Data size Type
GNU 20 GNU_BUILD_ID
Build ID: d75a086c288c582036b0562908304bc3a8033235
.note.gnu.build-id
部分为36个字节。构建ID为20个字节。其他16个字节是什么?
我稍微玩了一下代码,并读取了偏移量myelffile
的{{1}}的36个字节。得到了以下0x2ac
。
然后我决定使用Elf64_Shdr
definition,因此我读取了地址040000001400000003000000474e5500d75a086c288c582036b0562908304bc3a8033235
上的数据,并得到了我的构建ID 0x2ac + sizeof(Elf64_Shdr.sh_name) + sizeof(Elf64_Shdr.sh_type) + sizeof(Elf64_Shdr.sh_flags)
。我为什么知道它d75a086c288c582036b0562908304bc3a8033235
确实很有意义,但是根据Elf64_Shdr
definition,我应该指向sizeof(Elf64_Shdr.sh_name) + sizeof(Elf64_Shdr.sh_type) + sizeof(Elf64_Shdr.sh_flags) = 16 bytes
,即部分虚拟地址。
所以我不清楚该节的其他16个字节是什么?它们代表什么?我无法调和Elf64_Shdr
definition和我从实验中得到的结果。
解决方法
.note.gnu.build-id部分为36个字节。构建ID为20个字节。其他16个字节是什么?
每个.note.*
部分以Elf64_Nhdr
(12字节)开头,后跟(4字节对齐)可变大小的音符名称(此处为GNU\0
),然后是(4字节)对齐的)实际音符数据。 Documentation。
查看我系统上的/bin/date
:
eu-readelf -Wn /bin/date
Note section [ 2] '.note.ABI-tag' of 32 bytes at offset 0x2c4:
Owner Data size Type
GNU 16 GNU_ABI_TAG
OS: Linux,ABI: 3.2.0
Note section [ 3] '.note.gnu.build-id' of 36 bytes at offset 0x2e4:
Owner Data size Type
GNU 20 GNU_BUILD_ID
Build ID: 979ae4616ae71af565b123da2f994f4261748cc9
偏移量0x2e4
处的字节是什么?
dd bs=1 skip=$((0x2e4)) count=36 < /bin/date | xxd
00000000: 0400 0000 1400 0000 0300 0000 474e 5500 ............GNU.
00000010: 979a e461 6ae7 1af5 65b1 23da 2f99 4f42 ...aj...e.#./.OB
00000020: 6174 8cc9 at..
所以我们有:.n_namesz == 4
,.n_descsz == 20
,.n_type == 3 == NT_GNU_BUILD_ID
,后跟4个字节的GNU\0
音符名称,后跟20个字节的实际build-id字节{{ 1}},0x97
等
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。