어셈블러 종류
- 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) ]
- 범용 레지스터
- 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)
[ ARM 레지스터 ]
임베디드에서 자주 사용됨.
디스어셈블러
- 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=
-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로 현재 함수의 지역변수에 접근한다.)
'Programming Language > Assembly' 카테고리의 다른 글
Calling Convention (0) | 2019.07.03 |
---|---|
POPAD / PUSHAD (0) | 2019.06.25 |
제로, 부호 플래그 (ZF & SF) / 비교 (cmp) 에 따른 점프 명령어 (0) | 2019.05.17 |