[Tip] Linux Objdump [2] 오브젝트 파일 역어셈블

개인 노트이므로 반말이 있어도 양해부탁드립니다.

objdump를 이용한 오브젝트 파일 disassemble

objdump는 ELF 바이너리인 경우 디어셈블을 할 수 있는데,  디어셈블을 할 때는 -d 옵션(--disassemble 옵션)을 사용합니다.

[*] objdump -d test
[#] 너무 길어서 이번에도 많은 부분을 생략.....!
출력 형식
주소 <심볼> :
    주소:  OPCODE  디어셈블 코드

이런 형식으로 출력을 해줍니다. 이 때 OPCODE가 불필요하다면 --no-show-raw-insn 옵션을 사용하여 OPCODE을 출력안하게 만들 수 있습니다.

[*] objdump -d --no-show-raw-insn test
[#] 너무 길어서 이번에도 많은 부분을 생략.....! 


위와 같은 -d 옵션으로 디어셈블할 때는 실행 코드가 있는 섹션(.text  등)을 디어셈블리의 대상으로 합니다. 하지만 모든 섹션을 대상으로 할 경우에는 -D 옵션(--disassemble-all 옵션)을 사용합니다.

objdump로 특정 섹션, 주소 범위만 디어셈블하기

특정 섹션을 지정해서 디어셈블을 할 수도 있습니다. 섹션 지정은 덤프할 때와 마찬가지로 -j 옵션( --section 옵션)을 사용합니다.

[*] objdump -d -j .init test
[#] .init섹션만을 디어셈블 했다. 

덤프와 마찬가지로 디어셈블도 주소를 지정하여 디어셈블할수도 있습니다. 하는 방법은 덤프할 때와 마찬가지로 --start-address, --stop-address 옵션을 사용합니다.

[*] objdump -d test
 [#]일단 주소를 알아낼려면 디어셈블을 하고,  main의 주소를 기억해두고
[#] 시작주소와 끝 주소를 지정하여 디어셈블합니다.

출력된 결과물을 파일로 저장하고싶다면 " > " 을 이용하여 파일로 출력할 수 있습니다.

[*] objdump -d --start-address=0x80483e4 --stop-address=0x80483ff test > test.txt
[*] cat test.txt
[#] 파일로 저장된 것을 확인할 수 있습니다.

소스 파일과 함께 출력하기

디버그 정보를 포함하고 있는 오브젝트 파일의 경우 -l 옵션(--line-numbers 옵션)을 사용하면, 각각의 코드에 대응하는 소스코드의 행에 관한 정보도 출력됩니다. 디버그 정보가 포함되어 있지 않은 경우에는 -l 옵션을 지정해도 의미가 없습니다.

디버그 정보를 포함하고 있는 오브젝트파일을 생성하는 하려면 컴파일 할 때 -g 옵션을 사용합니다.

[*] gcc -g -o degtest  file1.c
[*] objdump -d -l degtest
[#] 많은 것을 출력해주지만 main부분만을 스크린샷을 찍었다.
만약 소스 파일이 존재하고 -S 옵션(--source 옵션)을 추가하면 -l 옵션의 행 번호에 해당하는 소스코드가 그 위치에 삽입되어 출력됩니다. (훨씬 보기 편하겠죠)

[*] objdump -d -S degtest
[#] main함수부분이 이쁘게 뭐가있는지 출력되는 것을 확인할 수 있다.

댓글