반응형

리버스 엔지니어링은 모든 보안 분야에서 중요한 부분입니다.

컴파일된 실행 파일을 리버스 엔지니어링 하는 작업에서 가장 중요한 단계 중 하나는 디스어셈블링입니다. 

디스어셈블링은 코드 컴파일 과정을 최대한 거꾸로 복원하는 작업이다. 


objdump는 디스어셈블링에 가장 유용한 도구 중 하나입니다.

objdump의 다양한 실행 옵션을 사용해서 ELF (Executable and Linkable Format, 실행 및 링크 가능 포맷) 바이너리의 다양한 섹션 정보를 추출이 가능


※ ELF  (Executable and Linkable Format, 실행 및 링크 가능 포맷) 

→ ELF는 실행 파일, 공유 라이브러리, 리눅스/유닉스 시스템용 오브젝트 파일 등을 기술하는 파일 형식이다


objdump -D bash : -D 옵션을 지정하면 바이너리를 디스어셈블링 한 후 그 결과 값을 화면에 출력한다.


root@choi:/home/choi# objdump -D bash |more


bash:     file format elf64-x86-64


Disassembly of section .interp:


0000000000000238 <.interp>:

 238:   2f                      (bad)

 239:   6c                      insb   (%dx),%es:(%rdi)

 23a:   69 62 36 34 2f 6c 64    imul   $0x646c2f34,0x36(%rdx),%esp

 241:   2d 6c 69 6e 75          sub    $0x756e696c,%eax

 246:   78 2d                   js     275 <_init@@Base-0x2bba3>

 248:   78 38                   js     282 <_init@@Base-0x2bb96>

 24a:   36 2d 36 34 2e 73       ss sub $0x732e3436,%eax

 250:   6f                      outsl  %ds:(%rsi),(%dx)

 251:   2e 32 00                xor    %cs:(%rax),%al


Disassembly of section .note.ABI-tag:


0000000000000254 <.note.ABI-tag>:

 254:   04 00                   add    $0x0,%al

 256:   00 00                   add    %al,(%rax)

 258:   10 00                   adc    %al,(%rax)

 25a:   00 00                   add    %al,(%rax)

 25c:   01 00                   add    %eax,(%rax)

 25e:   00 00                   add    %al,(%rax)

 260:   47                      rex.RXB

 261:   4e 55                   rex.WRX push %rbp

 263:   00 00                   add    %al,(%rax)

 265:   00 00                   add    %al,(%rax)

 267:   00 03                   add    %al,(%rbx)

 269:   00 00                   add    %al,(%rax)

 26b:   00 02                   add    %al,(%rdx)

 26d:   00 00                   add    %al,(%rax)

 26f:   00 00                   add    %al,(%rax)

 271:   00 00                   add    %al,(%rax)

        ...


Disassembly of section .note.gnu.build-id:


0000000000000274 <.note.gnu.build-id>:

 274:   04 00                   add    $0x0,%al

 276:   00 00                   add    %al,(%rax)

 278:   14 00                   adc    $0x0,%al 


기본으로 실행했을 때 디스어셈블링은 끝이다. 하지만 다양한 옵션을 통해서 재미있는 분석이 가능하다


objdump -j [섹션명] -D [바이너리]


이 옵션을 사용하게 되면 원하는 섹션 정보만을 추출 해서 볼 수 있다.


root@choi:/home/choi# objdump -j .interp -D bash


bash:     file format elf64-x86-64



Disassembly of section .interp:


0000000000000238 <.interp>:

 238:   2f                      (bad)

 239:   6c                      insb   (%dx),%es:(%rdi)

 23a:   69 62 36 34 2f 6c 64    imul   $0x646c2f34,0x36(%rdx),%esp

 241:   2d 6c 69 6e 75          sub    $0x756e696c,%eax

 246:   78 2d                   js     275 <_init@@Base-0x2bba3>

 248:   78 38                   js     282 <_init@@Base-0x2bb96>

 24a:   36 2d 36 34 2e 73       ss sub $0x732e3436,%eax

 250:   6f                      outsl  %ds:(%rsi),(%dx)

 251:   2e 32 00                xor    %cs:(%rax),%al 


※ 특히 .text 세그먼트(섹션)에는 실행 코드가 들어 있으며 이 부분을 잘 분석하는 것이 리버스 엔지니어링의 시작이다.


반응형

+ Recent posts