ELF 파일의 빌드 ID 데이터 오프셋

Aug 18 2020

build-idELF 메모 섹션 을 수정해야합니다 . 여기서 가능하다는 것을 알았습니다 . 또한 이 코드를 수정하여 할 수 있다는 것도 알아 냈습니다 . 내가 알아낼 수없는 것은 데이터 위치입니다. 여기에 제가 말하는 것이 있습니다.

$ 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 바이트는 무엇입니까?

나는 코드를 조금 가지고 놀았고 myelffileoffset에서 36 바이트를 읽었다 0x2ac. 다음을 얻었습니다 040000001400000003000000474e5500d75a086c288c582036b0562908304bc3a8033235.

그런 다음 Elf64_Shdrdefinition 을 사용하기로 결정 했으므로 주소에서 데이터를 읽고 0x2ac + sizeof(Elf64_Shdr.sh_name) + sizeof(Elf64_Shdr.sh_type) + sizeof(Elf64_Shdr.sh_flags)빌드 ID를 얻었습니다 d75a086c288c582036b0562908304bc3a8033235. 내가 왜 그것을 얻었는지 이해가 sizeof(Elf64_Shdr.sh_name) + sizeof(Elf64_Shdr.sh_type) + sizeof(Elf64_Shdr.sh_flags) = 16 bytes되지만 Elf64_Shdr정의 에 따르면 내가 가리키는 것 Elf64_Addr sh_addr, 즉 섹션 가상 주소.

그래서 나에게 명확하지 않은 것은 섹션의 다른 16 바이트는 무엇입니까? 그들은 무엇을 상징합니까? 실험에서 얻은 Elf64_Shdr정의 와 결과를 조정할 수 없습니다 .

답변

1 EmployedRussian Aug 18 2020 at 09:07

.note.gnu.build-id 섹션은 36 바이트입니다. 빌드 ID는 20 바이트입니다. 다른 16 바이트는 무엇입니까?

.note.*섹션은 Elf64_Nhdr(12 바이트)로 시작하고 (4 바이트 정렬) 가변 크기의 음표 이름 ( GNU\0여기), (4 바이트 정렬) 실제 음표 데이터가 이어집니다. 문서 .

/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바이트 실제 빌드-ID의 20 바이트 다음에, 주 이름 0x97, 0x9a