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. 6. 29. 23:17

♧ od는 octal dump(『octal』은 8진법을 뜻함)로, 기본적으로 바이너라 파일을 8진수로 덤프해서 출력.

   

[ 기본적인 8진수 덤프 ]

⊙ 행 앞 첫 컬럼에 해당하는 숫자(밝은녹색 테두리 부분)는 시작점으로부터의 오프셋을 8진수로 표시한 것.

(※ offset은 좌측 메모리 시작점을 0으로 하여 숫자를 통해 위치를 알려주는 좌표계 역할을 함)

   

[ 출력 형식 지정 ] -t옵션(--format=TYPE)

⊙ 일반적으로 8진수 보다 16진수로 표시되는 게 알기 쉽다.

의미

a

문자의 이름(7비트 ASCII)

c

ASCII문자 or 이스케이프(escape)문자

f[SIZE]

부동소수점 수

o[SIZE]

8진수

d[SIZE]

부호가 있는 10진수

u[SIZE]

부호가 없는 10진수

x[SIZE]

16진수

(※ a,c → 바이트 단위로 출력)

   

[ o, d, u, x :: 뒤에 올 수 있는 크기 지정자]

C

char

S

short

I

int

L

long

   

[ f :: 뒤에 올 수 있는 크기 지정자]

F

float

D

double

L

long double

   

⊙ 오프셋 표기도 8진수 외에 다른 형태로 표시할 수 있다.

'-A 옵션'에 다음 지정자를 이용하면 오프셋의 기수를 변경할 수 있음.

-A옵션 (--address-radix=RADIX)

[radix]

[의미]

o

8진수(기본 설정)

d

10진수

x

16진수

n

오프셋을 표시하지 않음

   

⊙ 또한 z를 덧붙이면 우측에 ASCII문자 표시가 추가.

   

ex) 출력 형식을(-t) 16진수(x) 1Byte단위(1)로 출력하고 우측에 ASCII문자 표시를 추가(z)

오프셋의 기수를 16진수로 출력(-A x)

   

[ 덤프를 생략하지 않기 ] -v옵션 (--output-duplicates)

⊙ 기본적으로 od는 같은 내용이 여러 행에 걸쳐 반복될 경우 그 부분을 생략 한다.

[ 0x0021d0~0x002220 까지는 00이 계속되고 있으므로 『*』와 같이 생략]

   

이 부분을 생략하지 않으려면 -v 옵션을 사용한다.

   

[ 문자열 덤프 기능] -S옵션 (--strings)

⊙ od에는 strings처럼 문자열 덤프 기능이 있다.

ASCII문자가 최소 세 자리 이상이고 \0으로 끝나는 바이트 열을 찾아 오프셋과 내용을 표시한다.

   

⊙ 다음은 위와 같지만 '--strings'옵션을 사용하고 '-An'으로 오프셋 출력을 하지 않는다.

   

(※ 책에서는 '소문자 -s옵션' 이라고 되어 있지만 이건 예전 버전의 옵션이다.

현재 버전에서는 '대문자 -S 옵션'이며 출력되는 최소문자 바이트를 넣어 주어야 한다.

그러므로 그냥 일반 적인 경우는 "--strings" 옵션을 사용하는 것이 호환성 측면에서 좋을 듯하다.)

※ 버전 별로 옵션이 조금씩 틀리므로 man od로 확인 하여 사용하자.

   

테스트 환경 :

  

Posted by devanix