어셈블리어 코딩연습 01.. MacOSX
어셈블리어 코딩 연습 01
어셈블리어로 가장 간단한 "Hello Word!!"를 만들어보겠습니다~~
SeoSeoung-oh@MacBook-Air$cat hello.c #include <stdio.h> int main(void) { printf("Hello It's C\n"); return 0; } SeoSeoung-oh@MacBook-Air$gcc -c hello.c -o hello.o SeoSeoung-oh@MacBook-Air$objdump -d hello.o -Mintel
hello.o: file format mach-o-x86-64
Disassembly of section .text:
0000000000000000 <_main>: 0: 55 push rbp 1: 48 89 e5 mov rbp,rsp 4: 48 83 ec 10 sub rsp,0x10 8: 48 8d 3d 00 00 00 00 lea rdi,[rip+0x0] # f <_main+0xf> f: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0 16: b0 00 mov al,0x0 18: e8 00 00 00 00 call 1d <_main+0x1d> 1d: b9 00 00 00 00 mov ecx,0x0 22: 89 45 f8 mov DWORD PTR [rbp-0x8],eax 25: 89 c8 mov eax,ecx 27: 48 83 c4 10 add rsp,0x10 2b: 5d pop rbp 2c: c3 ret
|
가장 기초적인 Hello~를 먼저 C언어로 만든후 디스어셈블하여 참고하려 합니다.
objdump에 ‘-d’ 옵션을 주어 디스어셈블하고, -Mintel 옵션을 주어 AT&T문법에서 intel문법으로 바꾸어 볼 수 있습니다.
어셈이 익숙하지 않아 출력 부분을 어떻게 해야할지 당황스럽네요 C언어의 printf가 이렇게 편한거였다니ㅠㅠ
셸코드 만들던 방법처럼 시스템 콜을 이용해서 시도해보겠습니다.
어셈블리어로 코딩해서 실행파일을 만드는 건 처음이라
오브젝트 파일을 링크하여 실행 파일을 만드는 것도 쉽지 않았습니다.
왜인지 모를 이유로 계속 막혔는데.. Macosx 운영체제? 의 문제더군요. 하…
제 macosx에 설치되어있던 nasm은 파일형식으로 macho32, macho64를 지원하지 않더군요
더 높은 버전으로 새로 설치한 후에도 많은 삽질을 했습니다ㅠㅠ
NASM에서 '-f'옵션으로 macho32, macho64 옵션을 줄 때 주의해야할 점
MacOSX 시스템 콜은 int 0x80을 통해 호출되기는 하지만, FreeBSD의 형식을 물려받아
- EAX에는 시스템 콜 번호를
- 매개변수는 스택을 통해 전달
- 반환값은 EAX에 남는 형식으로 호츨된다고 합니다.
게다가, 시스템 콜 호출 전에는 4바이트의 여유 공간을 두어야 한다고 합니다.
( 참고 - http://dhdhfl.tistory.com/144 )
---------이 부분은 나중에 확인을 해봐야할 것 같습니다----------
이런 차이가 있는 줄은 몰랐는데..ㅠㅠ 소스는 남겨두고
시간날 때 macosx 말고 다른 환경에서 다시 한번 코딩해봐야겠습니다..