ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Assembly의 기초
    WeekHack/ASM_Coding 2019. 8. 1. 11:08
    반응형
    SMALL

    안녕하세요. Luke입니다. Asm_Coding 카테고리를 새로 신설하여 어셈블리어로 간단한 코딩을 하는 법을 포스팅해보려 합니다. 기존은 intel 문법입니다.

    pwnable.tw 풀려는데 IDA Hexray에 익숙해져버려 다시 공부할 겸 정리하는 건 안비밀. start 문제 풀려고 다시 정리하는것도 안비밀

    이 어셈말고..

     

     

    먼저 ASM의 기본적인 문법은

     

    옵코드와 인자로 이루어져있습니다. 옵코드는 명령어이며 인자는 말 그대로 해당 옵코드에 전달할 인자를 뜻합니다.

    ex) mov eax, 3

    위의 예제에서 mov는 옵코드, eax와 3은 인자입니다.

     

    그럼 이쯤되서 다들 궁금하신게 있을 건데요..

    저 위의 eax는 무엇일까요? 저 eax는 바로...레지스터입니다. 그중에서도 eax의 경우 범용 레지스터라고 합니다.

     

    그럼 이제 레지스터에 대해 설명해보도록 하겠습니다.

    레지스터는 CPU 내에 있는 저장공간으로 변수와 비슷한 역할을 합니다. 레지스터는 아래의 5가지 종류가 있습니다.

    • 범용 레지스터
    • 세그먼트 레지스터
    • 포인터 레지스터
    • 인덱스 레지스터
    • 플래그 레지스터

    그 중에서 어셈을 작성하는데 꼭 필수적인 범용 레지스터에 대해서만 간단히 설명해보도록 하겠습니다.

     

    범용 레지스터는

    말 그대로 범용인 레지스터로 가장 일반적인 레지스터입니다. 사전에 어떤용도로 사용할 지에 대한 표준이 정해져있으나, 표준을 지키지 않아도 사용은 가능합니다.(단, system call 같은 경우에는 반드시 해당 표준을 지켜줘야합니다.)
    범용 레지스터에는 eax, ebx, ecx, edx가 있습니다.

     

    그럼 이제 위에서 말한 정해진 표준을 알아볼까요?

    • eax: 계산 결과를 중간에 저장하는 레지스터(누산기)입니다. 곱셈과 나눗셈 연산에서 사용합니다.
    • ebx: 특정 주소를 지정하는 베이스 레지스터 입니다.
    • ecx: 반복문에서 반복 횟수를 셀 때 사용합니다.
    • edx: 입출력 연산에서 간접 주소 지정에 사용합니다.

     

    그럼 이제 주요된 어셈블리 옵코드의 각각의 기능을 정리해보겠습니다.

    • mov: mov라서 move라고 생각하시기 편할 거 같은데 이동 명령이 아닌 복사 명령입니다. mov eax, 4 명령의 경우 eax에 4를 복사하는 명령입니다. mov [붙여넣을 인자] [복사할 인자]와 같이 사용하면 됩니다.
    • push: 푸쉬, 즉 미는 것 같은 옵코드입니다. 스택에 인자를 넣습니다. 사용법은 push [인자] 입니다.
    • pop: 스택에서 인자를 빼냅니다. 사용법은 pop [인자]입니다.
    • jmp: 점프와 비슷하게 보이는 옵코드입니다. 점프 말 그대로 특정 주소를 인자로 넣어 해당 주소로 이동합니다. 사용법은 jmp [인자]입니다.
    • call: jmp와 똑같이 인자로 받은 특정 주소로 이동합니다만 차이는 리턴주소를 스택에 저장합니다. 함수 호출에 사용합니다.
    • ret: call에서 저장한 리턴주소로 돌아갑니다.
    • int: 해당 번호의 인터럽트를 줍니다. 사용법은 int [인자] 입니다.
    • nop: 아무것도 하지 않습니다.

     

    그럼 마지막으로 system call에 대해 정리해보도록 하겠습니다.

    메모리에는 커널 영역과 유저 영역이 존재합니다. 보통 우리가 말하는 스택과 힙과같은 영역은 모두 유저 영역으로 시스템 구동에 중요한 역할을 하는 커널 영역에는 접근할 수 없습니다. 그러나, 커널 모드에게 커널모드에서 어떠한 코드를 사용하겠다고 선언을 하면 커널 영역을 사용할 수 있는게 그것이 바로 system call입니다.

     

    system call은 eax로 시스템 콜의 번호를, 나머지 레지스터를 이용해 인자를 전달합니다.

    eax에 들어가는 시스템 콜의 번호는: https://syscalls.kernelgrok.com 에서 확인하실 수 있습니다.

     

    system call 예시)
            mov eax, 4
            mov ebx, 1
            mov ecx, helloworld
            mov edx, len_helloworld
            int 80h

     

    4번 시스템콜(write)를 호출해 인자로 1, helloworld변수, len_helloworld변수를 전달한다.

     

    이상입니다. 다음에는 어셈으로 hello world를 짜는 포스팅으로 돌아오도록 하겠습니다.

     

     

    참고한 자료:
    https://blog.kshgroup.kr/16th-hackingcamp-chell-sode/

    https://karfn84.tistory.com/entry/%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC-%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0%EC%9D%98-%EA%B8%B0%EB%8A%A5

    반응형
    LIST

    댓글

Copyright ⓒ 2019, WeekHack