본문 바로가기

드림핵

[드림핵 Reverse Engineering] Stage 4


[Stage 4] 어셈블리어 

#어셈블리어 #어셈블러 #역어셈블러

 

 

- 어셈블리 언어(Assembly Language) : 컴퓨터 세계에서 통용되는 기계어의 난해한 점을 개선하기 위해 고안된 기계어보다 이해하기 쉬운 언어.

- 어셈블러(Assembler) : 일종의 통역사로, 개발자가 어셈블리어로 코드를 작성하면 컴퓨터가 이해할 수 있는 기계어로 번역해주는 프로그램.

- 역어셈블러(Disassembler) : 기계어를 어셈블리어로 번역해주는 프로그램.

 

- x86-64 어셈블리어 문법 구조

    > 구성요소 : 명령어(Operation Code)-동사에 해당, 피연산자(Operand)-목적어에 해당

 

- 인텔의 x64 주요 명령어

    > 데이터 이동 : MOV, LEA

    > 산술 연산 : INC, DEC, ADD, SUB

    > 논리 연산 : AND, OR, XOR, NOT

    > 비교 : CMP, TEST

    > 분기 : JMP, JE, JG

    > 스택 : PUSH, POP

    > 프로시저 : CALL, RET, LEAVE

    > 시스템 콜 : SYSCALL

 

- 피연산자

    > 피연산자의 종류 : 상수, 레지스터, 메모리

    > 크기 지정자 : TYPE PTR

        *type의 종류 : BYTE(1바이트), WORD(2바이트), DWORD(4바이트), QWORD(8바이트)

 


[Stage 4] 명령 코드

#데이터이동 #산술연산 #논리연산 #비교 #분기 #스택 #프로시저

 

- 데이터 이동 명령어 : 어떤 값을 레지스터나 메모리에 옮기도록 지시

    MOV dst, src : src에 있는 값을 dst에 대입

    LEA dst, src : src의 유효 주소를 dst에 저장

 

- 산술 연산 명령어 : 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 지시

    ADD dst, src : dst에 src 값을 더함

    SUB dst, src : dst에서 src 값을 뺌

    INC op : op의 값을 1 증가시킴

    DEC op : op의 값을 1 감소시킴

 

- 논리 연산 명령어 : and, or, xor, neg 등의 비트 연산

    AND dst, src : dst와 src의 비트가 모두 1이면 1, 아니면 0

    OR dst, src : dst와 src의 비트 중 하나라도 1이면 1, 아니면 0

    XOR dst, src : dst와 src의 비트가 서로 다르면 1, 같으면 0

    NOT op : op의 비트 모두 반전

 

- 비교 명령어 : 두 피연산자의 값을 비교하고 플래그 설정(연산 결과를 op1에 대입하지 않음)

    CMP op1, op2 : op1과 op2를 비교. 두 피연산자의 값을 빼서 결과가 0이면(두 값이 같으면) ZF 플래그 설정.

    TEST op1, op2 : op1과 op2를 비교. 두 피연산자에 AND 비트 연산 하여 결과가 0이면 ZF 플래그 설정.

 

- 분기 명령어 : RIP를 이동시켜 실행 흐름을 바꿈

    JMP addr : addr로 RIP를 이동

    JE addr : 직전에 비교한 두 피연산자 같으면 addr로 RIP를 이동(jump if equal)

    JG addr : 직전에 비교한 두 피연산자 중 전자가 크면 addr로 RIP를 이동

 

- 스택 명령어 : 스택을 조작할 수 있음

    PUSH val : val을 스택 최상단에 쌓음

    POP reg : 스택 최상단의 값을 꺼내서 reg에 대입

 

- 프로시저 명령어 : 프로시저의 호출과 반환

        *프로시저란? 특정 기능을 수행하는 코드 조각

    CALL addr : addr에 위치한 프로시저 호출

    LEAVE : 스택 프레임 정리

    RET : return address로 반환