공유 라이브러리의 정보는 ELF의 동적 섹션의 NEEDED에 기록되어 있다.
$ readelf -d /bin/ls Dynamic section at offset 0x19f04 contains 26 entries: Tag Type Name/Value 0x00000001 (NEEDED) Shared library: [libselinux.so.1] 0x00000001 (NEEDED) Shared library: [libacl.so.1] 0x00000001 (NEEDED) Shared library: [libc.so.6] 0x0000000c (INIT) 0x804958c 0x0000000d (FINI) 0x805a49c 0x00000019 (INIT_ARRAY) 0x8062ef8 0x0000001b (INIT_ARRAYSZ) 4 (bytes) 0x0000001a (FINI_ARRAY) 0x8062efc 0x0000001c (FINI_ARRAYSZ) 4 (bytes) 0x6ffffef5 (GNU_HASH) 0x80481ac 0x00000005 (STRTAB) 0x8048a38 0x00000006 (SYMTAB) 0x8048218 0x0000000a (STRSZ) 1493 (bytes) 0x0000000b (SYMENT) 16 (bytes) 0x00000015 (DEBUG) 0x0 0x00000003 (PLTGOT) 0x8063000 0x00000002 (PLTRELSZ) 896 (bytes) 0x00000014 (PLTREL) REL 0x00000017 (JMPREL) 0x804920c 0x00000011 (REL) 0x80491d4 0x00000012 (RELSZ) 56 (bytes) 0x00000013 (RELENT) 8 (bytes) 0x6ffffffe (VERNEED) 0x8049114 0x6fffffff (VERNEEDNUM) 2 0x6ffffff0 (VERSYM) 0x804900e 0x00000000 (NULL) 0x0 |
$ objdump -p /bin/ls /bin/ls: file format elf32-i386 Program Header: PHDR off 0x00000034 vaddr 0x08048034 paddr 0x08048034 align 2**2 filesz 0x00000120 memsz 0x00000120 flags r-x INTERP off 0x00000154 vaddr 0x08048154 paddr 0x08048154 align 2**0 filesz 0x00000013 memsz 0x00000013 flags r-- LOAD off 0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12 filesz 0x00019be0 memsz 0x00019be0 flags r-x LOAD off 0x00019ef8 vaddr 0x08062ef8 paddr 0x08062ef8 align 2**12 filesz 0x00000448 memsz 0x0000109c flags rw- DYNAMIC off 0x00019f04 vaddr 0x08062f04 paddr 0x08062f04 align 2**2 filesz 0x000000f8 memsz 0x000000f8 flags rw- NOTE off 0x00000168 vaddr 0x08048168 paddr 0x08048168 align 2**2 filesz 0x00000044 memsz 0x00000044 flags r-- EH_FRAME off 0x00016568 vaddr 0x0805e568 paddr 0x0805e568 align 2**2 filesz 0x00000744 memsz 0x00000744 flags r-- STACK off 0x00000000 vaddr 0x00000000 paddr 0x00000000 align 2**4 filesz 0x00000000 memsz 0x00000000 flags rw- RELRO off 0x00019ef8 vaddr 0x08062ef8 paddr 0x08062ef8 align 2**0 filesz 0x00000108 memsz 0x00000108 flags r-- Dynamic Section: NEEDED libselinux.so.1 NEEDED libacl.so.1 NEEDED libc.so.6 INIT 0x0804958c FINI 0x0805a49c INIT_ARRAY 0x08062ef8 INIT_ARRAYSZ 0x00000004 FINI_ARRAY 0x08062efc FINI_ARRAYSZ 0x00000004 GNU_HASH 0x080481ac STRTAB 0x08048a38 SYMTAB 0x08048218 STRSZ 0x000005d5 SYMENT 0x00000010 DEBUG 0x00000000 PLTGOT 0x08063000 PLTRELSZ 0x00000380 PLTREL 0x00000011 JMPREL 0x0804920c REL 0x080491d4 RELSZ 0x00000038 RELENT 0x00000008 VERNEED 0x08049114 VERNEEDNUM 0x00000002 VERSYM 0x0804900e |
/bin/ls는 libselinux.so.1, libacl.so.1, libc.so.6 3개의 공유 라이브러를 사용하는 것을 알 수 있다.
ldd로 공유 라이브러리 의존관계 확인
프록램에서 사용하는 공유 라이브러리 목록을 출력할 수 있습니다. 특정 버전의 경우 프로그램을 실행하면서 의존성 정보를 가져오므로 악성코드같은 신뢰하지 않은 파일에서는 테스트를 금지합니다. 대안으로 위 예제에서 사용한 objdump -p <file> | grep NEEDED를 사용합니다.
$ ldd /bin/ls linux-gate.so.1 => (0xb779a000) libselinux.so.1 => /lib/i386-linux-gnu/libselinux.so.1 (0xb775f000) libacl.so.1 => /lib/i386-linux-gnu/libacl.so.1 (0xb7756000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb75a6000) libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb7568000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb7563000) /lib/ld-linux.so.2 (0x800c2000) libattr.so.1 => /lib/i386-linux-gnu/libattr.so.1 (0xb755d000) |
'Hacking > Binary' 카테고리의 다른 글
Binary@library# 공유 라이브러리 (0) | 2018.02.25 |
---|---|
Binary@library# 정적 라이브러리 (0) | 2018.02.25 |
Binary@ELF# nm - 오브젝트 파일에 포함된 심볼 확인 (0) | 2018.02.17 |
Binary@ELF# ELF Header (0) | 2018.02.15 |
How main() is executed on Linux (0) | 2017.05.29 |