2011. 7. 3. 02:54

[ objdump를 이용한 오브젝트 파일 역어셈블 ]

 

♧ 역어셈블 관련 옵션

옵션 [ 긴 옵션 ]

설명

-d | --disassemble

오브젝트 파일을 기계어로 역어셈블 (실행 코드가 있는 섹션)

-D | --disassemble-all

모든 섹션을 대상으로 역어셈블

--[no-]show-raw-insn

코드와 바이트열 제거/출력 [디폴트=보여줌]

--prefix-address

코드의 주소를 심볼에서의 상대주소로 표시

-j section | --section=section

특정 섹션 지정

-l | --line-numbers

각각의 코드에 대응하는 소스코드의 행에 관한 정보 출력.

-S | --source

행 번호에 해당하는 소스코드가 그 위치에 삽입되어 출력.

   

   

▶ -d 옵션을 사용한 일반적인 역어셈블

▷ -d 옵션을 사용해 역어셈블 할 때는 통상 실행 코드가 있는 섹션(.text등)을 역어셈블 대상으로 삼는다.

   

▶-D 옵션을 사용해 모든 섹션을 대상으로 역어셈블

길어서 pass~

   

▷ 일반적인 역어셈블 결과는 다음과 같은 형식으로 출력.

주소 <심볼>:

  주소: 코드의 바이트열 역어셈블 코드

   

▶ 『--no-show-raw-insn』 옵션을 사용하여 코드의 바이트 제거하여 출력.

   

▶ 『--prefix-address』 옵션을 사용하여 코드 주소를 심볼에서의 상대 주소로 표시

   

▷ 『--prefix-address』 옵션을 사용하면 디폴트로 코드의 바이트열은 출력되지 않음으로,

출력하고자 할 경우에는 『--show-raw-insn』 옵션을 함께 사용.

   

▶ 덤프할 때와 마찬가지로 -j 옵션을 사용하여 특정 섹션 지정 출력

   

▶ 덤프할 때와 마찬가지로 주소 범위 지정 출력

전 챕터(Hack #9)에서 했으므로 패스~

   

▶ -l옵션을 사용하여 가각의 코드에 대응하는 소스코드의 행에 관한 정보도 출력.

   

▶ -S옵션을 사용하여 -l 옵션의 행 번호에 대응하는 소스코드를 삽입하여 출력.

▷ -S옵션과 -l옵션 동시 사용 가능

▷ -S옵션과 -l옵션은 오브젝트 파일에 디버그 정보가 포함되어 있어야 함. (gcc –g)

   

▷ 오브젝트 파일의 디버그 정보로는 소스코드 경로명과 행 번호만 포함되므로

해당 경로에 소스 파일이 존재해야 한다. 만약 소스 파일이 없다면 소스는 출력되지 않으며

다른 소스 파일이 존재한다면 엉뚱한 소스가 출력될 것이다.

▶ 소스 파일명을 변경후, -S옵션을 사용하였음에도 소스코드는 출력 되지 않음.

   

   

▷ 링크하기 전의 오브젝트 파일에서는 재배치되는 주소가 0임에 주의해야 한다.

▷ 위 예에서는 "Hello World!!!\n"을 가리키는 포인터는 12~15 사이의

4바이트에 채워져 있어야 하지만, 링크하기 전이므로 0인 채로 남아 있다.

   

▶ 링크 후 생성된 실행 파일에서는 해당하는 부분에 다음과 같이 주소가 채워져 있다.

  

 

Posted by devanix
2011. 7. 3. 02:12

[ 일반적인 ELF 바이너리 덤프 ]

『 -s | --full-contents 』 :: 모든 섹션의 전체 내용을 표시.

   

▶ 일반적인 덤프.

# objdump -s /bin/ls

▷ 덤프 형식 :: [메모리 주소] [16진수 덤프 (4바이트 * 4)] [ASCII 표시]

▷ 여기서 16진수 덤프는 x86과 같은 리틀 엔디안 아키텍처에서 실행해도 빅 엔디안으로 출력.

▷ objdump에는 -endian 옵션이 있지만 이 옵션은 단지 디스어셈블할 경우에만 영향을 줄 뿐,

출력 시에는 영향을 주지 않는다.

▷ 통상 elf32-i368이므로 섹션 별로 식별해서 덤프 하게 된다.

   

▷ 오브젝트 형식은 -b 옵션 (--target옵션)으로 지정.

▷ 지정 가능한 오브젝트 형식은 -i 옵션 (--info 옵션)으로 확인.

...(중략)...

  

   

[ ELF 바이너리의 특정 섹션 덤프 ]

♧ 『 -j section | --section=section 』 :: 특정 섹션을 지정하여 덤프

   

▶ 특정 섹션 지정하여 덤프

# objdump -s -j .interp /bin/ls

   

▷ 어떤 섹션이 존재 하는지 확인하기 위해 -h 옵션(--sction-headers, --headers)으로 출력.

...(중략)...

   

[ 주소 범위를 지정하여 덤프 ]

♧ 『 --start-address=address 』 『 --stop-address=address 』 ::

덤프할 주소 범위를 지정하여 덤프.

   

▶ 0x8048154 ~ 0x80481bc까지 주소 지정하여 덤프.

# objdump -s --start-address=0x8048154 --stop-address=0x80481bc /bin/ls

  

   

[ objdump로 바이너리 덤프 ]

♧ 『-b bfdname | --target=bfdname』 :: ELF 형식이 아닌 파일 또는 ELF 파일을

그저 바이너리 파일로 덤프 하고자 할 경우에는 오브젝트 형식으로 binary를 지정.

   

# objdump -s -b binary /etc/ld.so.cache

...(중략)...

▷ 이런 경우 주소는 파일 오프셋과 같다.

▷ binary로 지정하면 섹션별로 나눠어서 출력되지 않는다.

▷ binary 형식은 자동 인식되지 않으므로 반드시 옵션을 지정.

  

Posted by devanix