2017. 10. 15. 18:58ㆍSystemHacking/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
'SystemHacking > Assembly' 카테고리의 다른 글
[6] 어셈블리 비트연산 ( shift, and, or, not ) (0) | 2017.10.20 |
---|---|
[5] 어셈블리 계산기 , scanf , printf (0) | 2017.10.19 |
[4] 어셈블리 명령어 add,sub,mul,div (0) | 2017.10.18 |
[3] 어셈블리 text section / mov / lea (0) | 2017.10.17 |
[2] 어셈블리 문자열 표현방식 / 데이터단위 / 레지스터 종류 (0) | 2017.10.16 |