[Tip] Linux Objdump [1] 오브젝트 파일 덤프

objdump를 이용한 ELF 바이너리 덤프

objdump 명령은 하나 이상의 옵션을 사용해야만 필요한 정보를 출력할 수 있습니다. 일반적인 덤프를 하려는 경우에는 -s 옵션(--full-contents 옵션)을 사용합니다.

[#] 너무 길어서 아랫부분은 생략....

출력 형식

메모리 주소 |   16진수 덤프(4바이트 * 4 )  | 아스키 코드

ELF 바이너리의 파일 형식 및 각 섹션 별 내용을 덤프해서 출력해줍니다. 
여기서 16진수 덤프는 x86과 같은 리틀 엔디안 아키텍처에서 실행해도 빅 엔디안으로 출력해줍니다. 예를 들면 .interp의 최초 4바이트는 ASCII로 '/lib'이지만, 16진수로는 2f 6c 69 62순으로 출력되었으므로 리틀엔디안이 아닙니다. objdump에는 -endian옵션이 있지만 이 옵션은 단지 objdump로 디스어셈블할 경우에만 영향을 줄 뿐 출력시에는 영향을 주지 않습니다.
  이와 같이 -s 옵션만 사용한 경우에는 기본적인 오브젝트 형식으로 출력되는데요. 통상 elf32-i386 이므로 섹션별로 식별해서 덤프하게 됩니다. 오브젝트 형식은 -b 옵션(--target 옵션)으로 지정할 수 있습니다. 지정 가능한 오브젝트 형식은 -i 옵션(--info 옵션)으로 확인할 수 있습니다.
[#] 이번에도 너무 길어서 아랫부분은 생략하였습니다. 

ELF 바이너리의 특정 섹션 덤프하기

특정 섹션만을 덤프하고자 할 경우에는 -j 옵션(section 옵션)으로 섹션명을 지정하여 사용할 수 있습니다.
그전에 어떤 섹션이 존재하는 지 확인하는 것은 -s 옵션을 이용해도 되지만, -h 옵션(--section-headers 옵션, --headers 옵션)으로 확인하고 Name부분을 -j 인자로 넣어서 그 섹션을 확인할 수 있습니다.

[#] 이번에도 너무 길어서 짤랐습니다...ㅠㅠ
[#] .got와 .dynamic를 확인해 보았습니다.

-h  옵션으로 어떤 섹션이 있는지 확인하고, 원하는 섹션만을 덤프해보았습니다.

주소 범위를 지정하여 덤프하기
--start-address 옵션 및 --stop-address 옵션을 사용하면 덤프할 주소 범위를 지정할 수 있습니다.
직접 알아보기 위해 앞에서 보았던 .dynamic영역을 확인하기 위해 시작 주소와 끝 주소를 찾습니다.
[#] 스샷을 보면 .dynamic의 시작주소 = 0x08049f20, 끝주소 = 0x08049fef(.got영역 -1해줘야 겠죠?)
인 것을 알 수 있습니다. 이 두 주소를 사용하여 dynamic영역만을 덤프해 볼 수 있습니다.


objdump로 바이너리 덤프하기

ELF 형식이 아닌 파일 또는 ELF 파일을 ELF가 아니라 그저 바이너리 파일로 덤프하고자 할 경우에는 오브젝트 형식으로 binary를 지정하면 됩니다.
 [#] ELF파일을 binary로 덤프 뜬 경우... 너무 길어서... 아래는 생략=ㅁ=

[#] binary파일을 덤프 출력.

binary파일을 출력할 때 조심할 점은. objdump가 binary을 인식하지 못하는 것입니다. 그래서 binary파일을 덤프할 땐 꼭 -b binary을 지정해줘야지 출력이 됩니다.


포스팅에 사용한 명령어

$ objdump -s test # 덤프 출력
$ objdump -i #지정 가능한 오브젝트 파일 정보 출력
$ objdump -h test  #섹션 헤더 출력
$ objdump -s -j .got text  # .got 섹션 출력
$ objdump -s -j .dynamic text # .dynamic 섹션 출력
$ objdump -s --start-address=0x8049f20 --stop-address=0x8049fef test #시작주소와 끝주소 사이 출력
$ objdump -s -b binary test #바이너리로 출력
$ objdump -s -b binary file1.c #바이너리로 출력

댓글