1. 어셈블리 프로그램 "Hello, haxor!" 를 화면에 출력
// vi hello.asm
section .data; section 선언
msg db "Hello, haxor!",0xa; 문자열과 줄을 바꿈.
len equ $ - msg; 문자열의 길이. 여기서 $는 이곳을 의미.
section .text; 강제 section 선언, 엔트리 포인트를 EL 링커로 보내거나
global _start; 일반적으로 로더는 _start를 엔트리 포인터로 인식
_start:
; 문자열을 stdout로 쓰기
mov edx, len; 세 번째 인수(메시지 길이)
mov ecx,msg; 두 번째 인수(쓸 메시지에 대한 포인터)
mov ebx,1; 첫 번째 인수 로딩(파일 핸들(stdout))
mov eax, 4; 시스템 호출 번호(4=sys_write)
int 0x80; 커널 인터럽트를 호출하고 나가기
mov ebx,0; 첫 번째 syscall 인수 로딩 (코드에서 나가기)
mov eax,1; 시스템 호출 번호(1=sys_exit)
int 0x80; 커널 인터럽트를 호출하고 나가기
// 저장하기 :wq
2. 어셈블링 - 오브젝트 코드를 만드는 것.
// hello.asm를 이용하여 hello.o를 형성하는 과정.
nasm -f elf hello.asm
// nasm 명령어를 사용하기 위해선 FFmpeg와 NASM설치가 필요하다.
* 설치법
https://videocube.tistory.com/entry/FFmpeg-%EC%84%A4%EC%B9%98-%ED%95%B4%EB%B3%B4%EC%9E%90-CentOS-63 참고하기!!
mkdir ~/ffmpeg_sources
cd ~/ffmpeg_source
git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg // 혹시나 git명령어가 먹히지 않는다면 yum install git 입력! // yum은 인터넷이 된다는 가정하에 사용 가능하다.
yum install autoconf automake bzip2 cmake freetype-devel gcc gcc-c++ git libtool make mercurial pkgconfig zlib-devel // Dependencies 설치
cd ~/ffmpeg_sources
curl -O -L http://www.nasm.us/pub/nasm/releasebuilds/2.13.02/nasm-2.13.02.tar.bz2
tar xjvf nasm-2.13.02.tar.bz2
cd nasm-2.13.02
./autogen.sh
./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin"
make
make install // NASM설치(Assembler)
//
다시
nasm -f elf hello.asm
실행 결과
// hello.o가 생긴 것을 확인할 수 있음.
3. 어셈블링 - 실행할 수 있는 링커 연결
ld -m elf_i386 hello.o
실행 결과는
4. 어셈블링 - 실행하기
// 책에서는 ./helloHello, haxor!라고 입력한다.
하지만 실행 결과,,, 오류가 난다.. 밑에 처럼... 그래서 한참 이것저것 해보다가.
아까 본 a.out이 생각났다.
그래서 hello대신에 a.out을 실행시켜보겠다고 결심!
짜잔!!!! 결과값이 나오긴했다!!!!
맞는지는 사실 모른다,,,,, 그냥,, 나름대로 오류를,,해결하도록 노력했다,,^^ 휴우 자야지..ㅎㅎㅎ
// Centos를 이용한 어셈블링 끝!