![objdump가 ELF 바이너리의 .got 섹션에 대한 항목을 표시하지 않는 이유는 무엇입니까?](https://linux55.com/image/155789/objdump%EA%B0%80%20ELF%20%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC%EC%9D%98%20.got%20%EC%84%B9%EC%85%98%EC%97%90%20%EB%8C%80%ED%95%9C%20%ED%95%AD%EB%AA%A9%EC%9D%84%20%ED%91%9C%EC%8B%9C%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
나는 ELF 바이너리의 .plt와 .got 섹션 사이의 관계를 알고 있습니다. 즉, 동적으로 로드된 각 함수(공유 라이브러리)에 대한 각 섹션에 해당 항목이 있어야 합니다.
실제로 .plt 항목은 printf
libc에서 로드되었기 때문에 존재합니다.
nlykkei@ubuntu-dev:~/Tools$ objdump -D -j .plt ~/myprog | grep printf
0000000000400530 <printf@plt>:
400530: ff 25 22 07 20 00 jmpq *0x200722(%rip) # 600c58 <printf@GLIBC_2.2.5>
해당 .got 항목이 주소에 있는 것을 볼 수 있습니다 0x600c58
. .plt 섹션에는 libc의 함수에 대한 총 7개의 항목이 포함되어 있습니다.
그러나 .got 테이블을 표시하면 8바이트만 표시됩니다.
nlykkei@ubuntu-dev:~/Tools$ objdump -D -j .got -z ~/myprog
/home/nlykkei/myprog: file format elf64-x86-64
Disassembly of section .got:
0000000000600c30 <.got>:
600c30: 00 00 add %al,(%rax)
600c32: 00 00 add %al,(%rax)
600c34: 00 00 add %al,(%rax)
600c36: 00 00 add %al,(%rax)
objdump
전체 .got 섹션을 주석(어떤 .got 항목이 어떤 .plt 항목에 해당하는지)과 함께 표시 하면 어떨까요 ?
답변1
PLT에서 사용하는 GOT 항목이 이 .got.plt
섹션에 저장됩니다. PLT에서 GOT로 매핑하는 경우 역 매핑을 수행할 수 있는 방법이 없다고 생각하므로 objdump
최선을 다하는 것은
$ objdump -d -s -j .plt -j .got.plt sysinfo
sysinfo: file format elf64-x86-64
Contents of section .plt:
400420 ff35e20b 2000ff25 e40b2000 0f1f4000 .5.. ..%.. ...@.
400430 ff25e20b 20006800 000000e9 e0ffffff .%.. .h.........
400440 ff25da0b 20006801 000000e9 d0ffffff .%.. .h.........
Contents of section .got.plt:
601000 200e6000 00000000 00000000 00000000 .`.............
601010 00000000 00000000 36044000 00000000 ........6.@.....
601020 46044000 00000000 F.@.....
Disassembly of section .plt:
0000000000400420 <.plt>:
400420: ff 35 e2 0b 20 00 pushq 0x200be2(%rip) # 601008 <_GLOBAL_OFFSET_TABLE_+0x8>
400426: ff 25 e4 0b 20 00 jmpq *0x200be4(%rip) # 601010 <_GLOBAL_OFFSET_TABLE_+0x10>
40042c: 0f 1f 40 00 nopl 0x0(%rax)
0000000000400430 <printf@plt>:
400430: ff 25 e2 0b 20 00 jmpq *0x200be2(%rip) # 601018 <printf@GLIBC_2.2.5>
400436: 68 00 00 00 00 pushq $0x0
40043b: e9 e0 ff ff ff jmpq 400420 <.plt>
0000000000400440 <sysinfo@plt>:
400440: ff 25 da 0b 20 00 jmpq *0x200bda(%rip) # 601020 <sysinfo@GLIBC_2.2.5>
400446: 68 01 00 00 00 pushq $0x1
40044b: e9 d0 ff ff ff jmpq 400420 <.plt>
Disassembly of section .got.plt:
0000000000601000 <_GLOBAL_OFFSET_TABLE_>:
601000: 20 0e 60 00 00 00 00 00 00 00 00 00 00 00 00 00 .`.............
...
601018: 36 04 40 00 00 00 00 00 46 04 40 00 00 00 00 00 [email protected].@.....