[ 소스코드에서 실행 가능한 이진 파일로 변환되는 과정 ]

출처

 

어셈블러 종류

  • nasm : intel, AT&T 문법 모두 지원
  • mips : mips 문법
  • intel : intel 문법
  • gcc : AT&T 문법 (컴파일러라서 소스코드를 바로 이진 파일로 변환)

** C/C++ 와 같은 native 언어는 컴파일러만 있으면 바로 소스코드를 변환한다. 파이썬,자바,C# 과 같은 가상언어들은 가상머신이 있어야만 코드를 변환할 수 있다. 단 어셈블리코드로 변환되는 것이 아니라 컴파일 시 가상머신에서 실행되는 언어로 변환된다. 따라서 모든 플랫폼 위에 가상머신이 있다면 잘 돌아간다.

** 디스어셈블하면, 기계어 코드 한줄과 어셈블리 명령어 한줄이 대응된다.

** opcode e5 는 echo 5 라고 발음

 

Intel vs AT&T 비교

  • intel은 명령어마다 길이가 다름(바이트수가다르다)
  • ARM이랑 MIPS는 모두 통일된 길이를 갖는다.

[ AT&T 문법 ]

방향: add [reg1 | addr1] [reg2 | addr2]

 : [reg2 | addr2] = [reg2 | addr2] + [reg1 | addr1]

방향: mov [reg1 | addr1] [reg2 | addr2]

: [reg2 | addr2] = [reg1 | addr1]

 

[ intel 문법 ]

방향: add [reg1 | addr1] [reg2 | addr2]

 : [reg1 | addr1] = [reg1 | addr1] + [reg2 | addr2]

방향: mov [reg1 | addr1] [reg2 | addr2]

: [reg1 | addr1] = [reg2 | addr2]

 

레지스터

[ intel i386 레지스터 (x32) ]

 

[ AMD64 범용 레지스터 (x64) ]

[ AMD64 세그먼트 레지스터 ]

출처

[ 1개의 레지스터로 64비트, 32비트, 16비트, 8비트 단위로 연산 가능 ]

출처

- 범용 레지스터

  • RAX : 산술 연산 및 함수 반환값에 사용
  • RBX : 메모리 주소 지정(데이터 포인터 용도), RSI,RDI와 함께 사용됨
  • RCX : 쉬프트 연산 및 loop counter로 사용
  • RDX : 산술 연산 및 I/O 명령에서 사용
  • RSI : 문자열 관련 Instruction 사용 시, Source
  • RDI : 문자열 관련 Instruction 사용 시, Destination
  • RBP : 현재 함수의 Base Pointer
  • RSP : 현재 스택 최상위를 가리킴, Push/Pop에 의해 항상 바뀜.
  • RIP : 다음에 수행 될 코드 영역을 가리키고 있음.

 

- 세그먼트 레지스터

  • Stack Segment (SS). 스택을 가리킨다.
  • Code Segment (CS). 코드를 가리킨다.
  • Data Segment (DS). 데이터를 가리킨다.
  • Extra Segment (ES). 추가적인 데이터를 가리킨다 ('Extra'의 첫 글자 'E').
  • F Segment (FS). 많은 추가적인 데이터를 가리킨다 ('E' 다음은 'F').
  • G Segment (GS). 더 많은 추가적인 데이터를 가리킨다 ('F' 다음은 'G').

 

각 레지스터의 역할

intel 모든 명령어 정보 (Instruction Set)

 

[ MIPS 레지스터 ]

MIPS 명령어 정보 (위키)

 

[ ARM 레지스터 ]

임베디드에서 자주 사용됨.

ARM Instruction Set

 

디스어셈블러

- objdump [사용법] : objdump -d <file path>

...더보기

OVERVIEW: llvm object file dumper

USAGE: objdump [options] <input object files> 



OPTIONS:
  -aarch64-neon-syntax     - Choose style of NEON code to emit from AArch64 backend:
    =generic               -   Emit generic NEON assembly
    =apple                 -   Emit Apple-style NEON assembly
  -all-headers             - Display all available header information
  -arch=           - architecture(s) from a Mach-O file to dump
  -arch-name=      - Target arch to disassemble for, see -version for available targets
  -archive-headers         - Display archive header information
  -archive-member-offsets  - Print the offset to each archive member for Mach-O archives (requires -macho and -archive-headers)
  -bind                    - Display mach-o binding info
  -color                   - Use colors in output (default=autodetect)
  -data-in-code            - Print the data in code table for Mach-O objects (requires -macho)
  -demangle=       - Demangle symbols names
  -df=             - List of functions to disassemble
  -dis-symname=    - disassemble just this symbol's instructions (requires -macho)
  -disassemble             - Display assembler mnemonics for the machine instructions
  -disassemble-all         - Display assembler mnemonics for the machine instructions
  -dsym=           - Use .dSYM file for debug info
  -dwarf                   - Dump of dwarf debug sections:
    =frames                -   .debug_frame
  -dylib-id                - Print the shared library's id for the dylib Mach-O file (requires -macho)
  -dylibs-used             - Print the shared libraries used for linked Mach-O files (requires -macho)
  -dynamic-reloc           - Display the dynamic relocation entries in the file
  -exports-trie            - Display mach-o exported symbols
  -fault-map-section       - Display contents of faultmap section
  -file-headers            - Display the contents of the overall file header
  -full-leading-addr       - Print full leading address
  -g                       - Print line information from debug info if available
  -help                    - Display available options (-help-hidden for more)
  -indirect-symbols        - Print indirect symbol table for Mach-O objects (requires -macho)
  -info-plist              - Print the info plist section as strings for Mach-O objects (requires -macho)
  -lazy-bind               - Display mach-o lazy binding info
  -line-numbers            - Display source line numbers with disassembly. Implies disassemble object
  -link-opt-hints          - Print the linker optimization hints for Mach-O objects (requires -macho)
  -macho                   - Use MachO specific object file parser
  -mattr=<a1,+a2,-a3,...>  - Target specific attributes
  -mcpu=         - Target a specific cpu type (-mcpu=help for details)
  -no-leading-addr         - Print no leading address
  -no-leading-headers      - Print no leading headers
  -no-show-raw-insn        - When disassembling instructions, do not print the instruction bytes.
  -no-symbolic-operands    - do not symbolic operands when disassembling (requires -macho)
  -non-verbose             - Print the info for Mach-O objects in non-verbose or numeric form (requires -macho)
  -objc-meta-data          - Print the Objective-C runtime meta data for Mach-O files (requires -macho)
  -print-imm-hex           - Use hex format for immediate values
  -private-header          - Display only the first format specific file header
  -private-headers         - Display format specific file headers
  -r                       - Display the relocation entries in the file
  -raw-clang-ast           - Dump the raw binary contents of the clang AST section
  -rebase                  - Display mach-o rebasing info
  -s                       - Display the content of each section
  -section=        - Operate on the specified sections only. With -macho dump segment,section
  -section-headers         - Display summaries of the headers for each section.
  -source                  - Display source inlined with disassembly. Implies disassemble object
  -start-address=

 - Disassemble beginning at address
  -stop-address=
  - Stop disassembly at address
  -t                       - Display the symbol table
  -triple=         - Target triple to disassemble for, see -version for available targets
  -universal-headers       - Print Mach-O universal headers (requires -macho)
  -unwind-info             - Display unwind information
  -version                 - Display the version of this program
  -weak-bind               - Display mach-o weak binding info

 

- 명령어 요약

...더보기

MOV [dest], [src] : 값이동

dest : reg|addr

src : imm(상수)|reg|mem

 

LEA [reg], [mem] : 주소이동 (Load Effect Address)

 

# MOV vs LEA

rbp address = 0x12341234

rbp value = 0x1

rbp-16 addr = 0x12341224 (16은 16진수로 10이다.)

rbp-16 = 0x2

 

MOV eax, [rbp-16] : eax = *(rbp-16) → 값을 넣기(0x2)

LEA eax, [rbp-16] : eax = (rbp-16) → 주소를 넣기(0x12341224)

 = sub rbp, 16 ; rbp = rbp-16

    mov eax, rbp ; eax = rbp

LEA는 2줄짜리 MOV 명령어를 1개 instruction 으로 만든다.

 

TEST [reg], [imm|reg] : xor (같으면 0이므로 clear)

JMP [LABEL] : 레이블에 오는 프로시저로 점프

CALL [LABEL] : 다음명령어 주소를 스택에 PUSH 하고, LABEL 주소를 호출함.

RET : 현재 RSP가 가리키고 있는 값(스택 최상위에 있는 값→ 이후 RSP+8)으로 점프 

 

JZ : JMP Zero (Zero Flag = 1일 때)

JE : JMP Equal

JLE : JMP Less Equal than

JGE : JMP Greater Equal than

JL : JMP Less than

JG : JMP Greater than

 

- 문자열관련명령어

REP [instruction]

 : RCX 레지스터를 1씩 감소시키면서(loop), 문자열 관련 명령어를 처리한다. memset, memcpy 구현할 때 필요

 

STOS

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

 

rep stos byte ptr [EDI] : ptr이 가리키는 주소로부터 byte단위로 EDI에 복사한다.

보통 ptr 은 rax가 가리키는 주소이다.

 

-Usage-

mov rax, rsi

mov rcx, 0x5

rep   stosb ; byte 단위로 실행

 

SCAS

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

 

PUSH [reg] / POP [reg] : reg에 저장된 값 또는 상수를 스택에 넣는다.

 

ADD/SUB/MUL/DIV : 사칙연산 eflags (=rflags)에 상당한 영향을 주는 명령어

 

RSP : 항상 스택 최상위를 가리킴 (PUSH/POP에 의해 증감)

RBP : 현재 함수 안에서 변수들의 기준점이 된다.(Base Pointer)

각 함수의 지역변수들은 저장되는 위치가 다르다. (RBP로 현재 함수의 지역변수에 접근한다.)

 

 

 

** x64 환경에서는 지원되지 않음

POPAD

  • 스택에 존재하는 값을 EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순서로 레지스터에 저장

  • PUSHAD 명령어로 스택에 보관해 놓은 레지스터 정보를 다시 이용할 때 사용

PUSHAD

  • EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순으로 레지스터의 값을 스택에 저장
  • 레지스터들의 값을 보관해야 할 때 사용

 

pushad 하게 되면

high address ----------------------------------------------> low address

...  |  eax  |  ecx  |  edx  |  ebx  | esp|  ebp  |  esi  |  edi  | ...

순서로 저장된다.

popad 할 때 위치도 저 위치이니 기억해야함

 

 

플래그

ZF 제로 플래그(Zero Flag) 연산 결과가 0이면 참(1)
SF 부호 플래그(Sign Flag) 연산 결과가 음수이면 참(1)

점프 명령어

jz <Operand>  제로 플래그가 참이면(연산 결과 = 0) Operand로 점프 합니다.
jnz <Operand>  제로 플래그가 거짓이면(연산 결과 != 0) Operand로 점프 합니다.
js <Operand>  부호 플래그가 참이면(연산 결과 < 0) Operand로 점프합니다.
jns <Operand>  부호 플래그가 거짓이면(연산 결과 >= 0) Operand로 점프합니다.

 

CMP 명령어에 따른 점프 명령어

cmp <Dest operand>, <Src operand > 대상 피연산자가 소스 피연산자를 비교해 조건부 점프 명령어가 사용할 플래그를 설정합니다.
je <Operand> CMP 명령어의 대상 피연산자와 소스 피연산자가 같으면 목적으로 점프 합니다.
jne <Operand> CMP 명령어의 대상 피연산자와 소스 피연산자가 같지 않으면 점프 합니다.
jl <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 작으면 점프 합니다.
jle <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 작거나 같으면 점프 합니다.
jnl <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 작지 않으면 점프 합니다.
jnle <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 작거나 같지 않으면 점프 합니다.
jg <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 큰 경우 점프 합니다.
jge <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 크거나 같으면 점프 합니다.
jng <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 크지 않으면 점프 합니다.
jnge <Operand> CMP 명령어의 대상 피연산자가 소스 피연산자 보다 크거나 같지 않으면 점프 합니다.

 

 

 

'Programming Language > Assembly' 카테고리의 다른 글

Calling Convention  (0) 2019.07.03
문법, 레지스터 정리  (0) 2019.07.03
POPAD / PUSHAD  (0) 2019.06.25

+ Recent posts