assembly 만 보고 어떤 라이브러리들이 임포트됬나 알수 있나요?

eternalklaus의 이미지

만약에 a라는 바이너리가 아래와 같이 컴파일되었다고 가정합니다.
$ gcc -o a a.c -lcrypto

그런데 10년 후, 소스코드(a.c)를 잃어버린 개발자의 컴퓨터에 a.s와 바이너리 a만 남아있었다고 가정했을때(-0-ㅋㅋㅋㅋ)
a.s를 다시 컴파일해서 잘 동작하는 바이너리 a를 만들고 싶습니다.

제가 이 개발자에게
컴파일 스크립트를 만들어줘야 하는 상황일 경우
어디에서 링킹정보를 얻어올 수가 있을까요?

pynoos의 이미지

링킹 힌트가 들어가지 않는 시스템에서는 찾는 수 밖에 없습니다.
1. a.o 를 만들고, nm으로 symbol을 덤프합니다.
2. 모든 library의 symbol을 덤프합니다.
3. 매칭되는 library를 스크립트에 명시합니다.

eternalklaus의 이미지

심볼을 찾아볼 때 항상 objdump -T -t 만 써왔었는데,
nm이라는 유용한 툴이 있었군요--;;;;
답변 감사합니다~~

bushi의 이미지

10년 후에도 10년 전의 바로 그 라이브러리를 구할 수만 있다면,

$ readelf -d `which bash`
Dynamic section at offset 0xfa680 contains 26 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libtinfo.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x2a9f0
 0x000000000000000d (FINI)               0xc3d94
 0x0000000000000019 (INIT_ARRAY)         0x2f7ea8
 0x000000000000001b (INIT_ARRAYSZ)       8 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x2f7eb0
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x000000006ffffef5 (GNU_HASH)           0x298
 0x0000000000000005 (STRTAB)             0x12050
 0x0000000000000006 (SYMTAB)             0x4ad8
 0x000000000000000a (STRSZ)              35747 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x2fa860
 0x0000000000000007 (RELA)               0x1be70
 0x0000000000000008 (RELASZ)             60288 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x0000000000000018 (BIND_NOW)           
 0x000000006ffffffb (FLAGS_1)            Flags: NOW PIE
 0x000000006ffffffe (VERNEED)            0x1bdc0
 0x000000006fffffff (VERNEEDNUM)         2
 0x000000006ffffff0 (VERSYM)             0x1abf4
 0x000000006ffffff9 (RELACOUNT)          2285
 0x0000000000000000 (NULL)               0x0
 
$ /lib64/ld-linux-x86-64.so.2 --list `which bash`
	linux-vdso.so.1 (0x00007ffeb6770000)
	libtinfo.so.6 => /lib64/libtinfo.so.6 (0x00007f0f7d9e0000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f0f7d7dc000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f0f7d416000)
	/lib64/ld-linux-x86-64.so.2 (0x00005600894a9000)
김정균의 이미지

앗 이거슨..

$ /lib64/ld-linux-x86-64.so.2 --list `which bash`

한 수 배웠습니다.

eternalklaus의 이미지

readelf 에 dynamic section 만을 볼수있는 옵션이 있었는지 처음 알았습니다...
유용한 답변 정말 감사드립니다 :D

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.