ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Assembly Basic
    Reversing 2019. 7. 6. 12:43

     

     

    Assembly 란


    프로그래밍 언어 중 하나, 기계어에서 한 단계 위의 언어

    low level 언어에 속한다.

    기계어는 CPU 가 채택한 ISA 에 따라 다르기 때문에 명령어 역시 통일된 규격이 없다.

    문법 아키텍쳐에 따라서도 다르고 어셈블러의 종류에 따라서도 문법/매크로 등이 다르다.

     

    MIPS / Intel / SPAC ... 에 따라 다름

     

     

     

     

     

    OP Code


    Binary code > Hex Code

    Hex Code 를 조금더 알아보기 쉽게 > Assembly

     

     

     

     

    https://software.intel.com 

     

    Intel® Software

    Check out the official source for developing on Intel hardware and software.

    software.intel.com

    AT&T 문법 과 Intel 문법의 차이가 있다

    AT&T 의 mov  >  mov %rsp,%rbp  >  mov [dest] [source]

    Intel 의 mov  > mov rbp, rsp  >  mov [source] [dest]

     

     

     

     

     

     

    Compile, Assemble


     

    High level language > Assembly code > Object Code > Executable > Execute

                       compiler            Assembler            Linker          Loader

     

     

    GNU Compiler Collection ( GCC )

     

     

     

     

     

    실습환경구성


    Ubuntu 16.04.3

    NASM 설치 (Intel ASM 문법) > sudo apt-get install nasm

    gcc 설치 (AT&T ASM 문법) > 기본적으로 설치 되어있음

     

     

     

     

     

     

    Hello world 출력하기


    nasm -felf64 hello.asm; ld -o hello hello.o

     

     

     

     

    자체 최적화 rax > eax 로 자동으로 바뀜, 레이블 정보 없고 주소랑 값으로 바뀐다.

     

     

     

     

    Register


    - 어셈블리에서 사용되는 기본 변수 이름

    - 다른 언어와 달리 하드웨어적으로 구현 됨

    - 이름 변경 불가능

    - CPU 종류 별로 레지스터 이름이 다 다르다

    - 레지스터 이름 별로 정해진 용도가 있다.

    - 위의 코드에서 message 는 nasm 이 정의한 symbol 이다.


     

     

     

     

    x64 Register


    출처 : https://www.chegg.com/homework-help/questions-and-answers/

     

    rbx, rcx, rdx 도 마찬가지

    rsi 는 esi(32), si(16), sil(8) 

    r8 은 r8d(32), r8w(16), r8b(8)

    edi 첫번째 인자

     

    RBP : 현재함수의 베이스 포인터

    RSP : 현재 스택 최상위를 가리킴

    RIP : 다음 수행 될 코드 영역을 가리키고 있음

     

     

     

     

     

     

     

    MIPS Register

    출처 : https://www.cs.fsu.edu/~hawkes/cda3101lects/chap3/F3.13.html

     

    ARM core register in ARM state (x32, x64:요즘 핸드폰)

     

    출처 : http://recipes.egloos.com/4986854

     

     

    MOV


    MOV eax, [rbp - 16]       > eax = *(rbp-16)

    LEA eax, [rbp - 16]        > eax = (rbp-16)

              > sub rbp, 16

                                       mov eax, rbp 와 같지 않음

     

     

     

     

    CMP, TEST


    비교에 관련되있다.

     

     

    JMP , CALL


    JMP 다음의 주소로 이동

    CALL : CALL 다음 명령어 주소를 스댁에 PUSH

    RET : 현재 RSP 가 가리키고 있는 값으로 점프, 스택 최상위에 있는 값으로 점프

     

     

     

    JZ, JE, JLE, JGE, JL, JG ..


    조건부 점프문 (외울 필요 X)

    eflags 에 영향을 가장 많이 받는 명령어들

     

     

     

    REP


    RCX 레지스터를 1씩 감소 시키면서, 문자열 관련 명령어를 처리한다.

    memset, memcpy ...구현할 때

     

     

     

    STOS


    AX 를 EDI 가 가리키는 주소에 넣음

    rep stos byte ptr [EDI]

     

     

    SCAS (strcmp)


    AX 에 저장되있는 값과 EDI 가 가리키는 곳에 저장되어 있는 값을 비교

     

     

     

    PUSH, POP


    push : 스택 최상위에 값을 넣음 : RSP register 증가

    pop : 스택 최상위에서 값을 뺌 : RSP register 감소

     

     

     

     

    ADD/ SUB/ MUL/ DIV


    더하기, 빼기, 곱하기, 나누기

    eflags 에 상당한 영향을 주는 명령어들임

     

     

     

     

     

    STACK


    - 함수 호출

    - 지역 변수 저장 및 사용

    ( 전역변수는 STACK 사용하지 않는다.)

    - 함수 인자 전달 (r7번째 인자부터)

     

     

     

     

    RSP


    항상 스택 최상위를 가리킴

    PHSH POP 에 의해 증감

     

     

    RBP


    현재 함수 안에서 변수들의 기준점이 됨.

     

     

     

     

    Return Address 


    함수 종료 후, 돌아갈 주소를 가르키고 있음

     

     

     

     

    SFP ( Saved Frame Pointer, Stack Frame Pointer )


    Caller 함수의 RBP 값을 가지고 있다.

     

     

     

     

     

     

    위 내용과 관련된 보안 요소


     

    1. POP 을 해도 RSP 의 값은 남아있다. ( 보안상 취약 )

     

    2. RIP 를 직접적으로 변경시킬 수 있을까?

    32 Bit 에서는 mov rip, 0x41414141 이 동작한다.

    64 Bit 에서는 작동하지 않는다.

     

    3. RIP 에 영향을 주는 것에는 어떤 것들이 있을까?

    Later~~

     

     

     

     

    댓글

Designed by Tistory.