공유 라이브러리의 정보는 ELF의 동적 섹션의 NEEDED에 기록되어 있다. 


$ readelf -/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 -/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)
 


















+ Recent posts