본문 바로가기

Programming/프로그래밍 공부

어셈블리어 코딩연습 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 말고 다른 환경에서 다시 한번 코딩해봐야겠습니다..