[1] 어셈블리 배경지식 / xxd, objdump 명령어 사용법

2017. 10. 15. 18:58SystemHacking/Assembly




어셈블러를 하기 전에 알아두어야 하는 것은 ELF 라는 리눅스 실행파일 구조이다

리눅스에서 실행파일들을 ELF 라는 구조를 가지고 파일시그니쳐에 ELF 가 있다

ELF의 형식을 간단히 표현하자면 다음과 같다


[ ELF 구조 ] : 여러개의 섹션들로 나뉘어 진다

1> .text section 

명령어가 들어가있는 섹션

- 실행코드가 존재하는 역역

- 읽기전용

- 실행가능한 메모리 영역

- 기계어 코드 ( 0 , 1 ) 이다


2> .rodata section

- 읽기만 가능한 데이터이다


3> .data section

-읽기,쓰기가 가능한 메모리 영역

- 초기값을 가지는 글로벌 변수

ex) 전역변수


4> .bss 섹션

- 읽기,쓰기가 가능한 메모리 영역

- 초기화 되지 않은 데이터 영역

- 초기값이 없는 글로벌 변수

ex) char buf[10];


4> 스택

- 파일 상에는 나타나지 않는다

ex) 지역변수


이러한 섹션들은 어셈블러에 의해서 정의되어진다


hello.s라는 어셈블파일의 내용이다

컴퓨터에서 직접 어셈블 프로그래밍하여 알아보기 불편하기 때문에 마지막에 직접 어셈블러로 작성해보겠다


hello.s -> hello.o 어셈블 파일(.s) 을 오브젝트 파일(.o) 로 어셈블 작업을 수행한 내용


xxd 명령어를 사용해서 이진수 파일인 hello.o 파일을 16진수 형태로 변환시켜서 출력할 수 있다

( -r 옵션은 그 반대이다 )


objdump 명령어를 통해서 hello.o 오브젝트 파일의 모든 내용을 확인 할 수 있다


objdump명령어에 -d(disassemble) 옵션을 주어서 hello.o 오브젝트 파일을 어셈블 파일로 변환할 수 있다

( 옵션설명 : -d --disassemble        Display assembler contents of executable sections )



[ 정리 ]

hello.s : 어셈블 파일 ( 어셈블러 파일 ) -> 어셈블 과정을 거치면 오브젝트 파일이 된다

hello.o : 오브젝트 파일 ( 이진수 파일 )

hello.o -> 링킹하면 실행파일이 된다

xxd 명령어를 통해서 오브젝트 파일을 16진수로 변환해서 눈으로 쉽게 확인할 수 있다

objdump 명령어를 이용해서 오브젝트 파일을 어셈블러로 변환해서 확인할 수 있다



위에서 사용한 어셈블러는 알아보기 어려웠다. 

직접 hello,world를 출력하는 어셈블리 파일을 작성해보자

#vi hello.asm


extern printf : printf함수 불러옴


section .data , section .text : data 섹션과 text섹션을 사용한다

text section : 명령어가 들어가는 섹션

data section : 초기값을 가지는 글로별 변수가 저장되는 섹션



#nasm -f elf -o hello.o hello.asm

elf 파일 형식으로 hello.asm 어셈블 파일을 hello.o 오브젝트 파일로 출력한다

( nasm이라는 어셈블러를 사용했다 )


#gcc -o hello hello.o

hello.o 오브젝트 파일을 링킹과정을 거쳐서 hello 실행파일로 출력한다


objdump 명령어를 이용해서 실행파일의 헤더구조를 조사해보자


참고할점 : 각 섹션들은 4kb 고정이다

text섹션의 4kb중 0x96byte만 사용했다

data섹션의 4kb중 0x10byte만 사용했다


[ NASM 숫자 표현 방식 ]


10진수    xxd

16진수    xxh

8진수    xxo

2진수    xxb