x86 Assembly : Essential Part(1)

곽무경·2022년 6월 28일
0

System Hacking

목록 보기
3/27

기계어 : 컴퓨터의 언어
어셈블러 : 어셈블리어로 작성된 코드를 기계어로 치환
역어셈블러 : 기계어를 어셈블리어로 번역
어셈블리 언어 : 컴퓨터의 기계어와 치환되는 언어

x64 어셈블리 언어

명령어, 피연산자로 구성

mov eax, 3 → 3을 eax에 대입

명령어

역할명령어
데이터 이동(Data Transfer)mov, lea
산술 연산(Arithmetic)inc, dec, add, sub
논리 연산(Logical)and, or, xor, not
비교(Comparison)cmp, test
분기(Branch)jmp, je, jg
스택(Stack)push, pop
프로시져(Procedure)call, ret, leave
시스템 콜(System Call)syscall

피연산자 : 상수, 레지스터, 메모리

메모리 피연산자 : []으로 둘러싸인 형태
BYTE(1바이트), WORD(2바이트), DWORD(4바이트), QWORD(8바이트)

메모리 피연산자역할
QWORD PTR [0x8048000]0x8048000의 데이터를 8바이트만큼 참조
DWORD PTR [0X8048000]0x8048000의 데이터를 4바이트만큼 참조
WORD PTR [rax]rax가 가리키는 주소에서 데이터를 2바이트만큼 참조

데이터 이동

어떤 값을 레지스터나 메모리에 옮기도록 지시

mov dst, src : src의 값을 dst에 대입
lea dst, src : src의 유효 주소를 dst에 대입

명령역할
mov rdi, rsirsi의 값을 rdi에 대입
mov QWORD PTR[rdi], rsirsi의 값을 rdi가 가리키는 주소에 대입
mov QWORD PTR[rdi+8*rcx], rsirsi의 값을 rdi+8*rcx가 가리키는 주소에 대입
lea rsi, [rbx+8*rcx]rbx+8*rcx를 rsi에 대입

산술 연산

사칙연산을 지시

명령역할
add eax, 3eax+=3
add ax, WORD PTR[rdi]ax에 rdi가 가리키는 값을 더함
sub eax, 3eax-=3
sub ax, WORD PTR[rdi]ax를 rdi가 가리키는 값만큼 뺌
inc eaxeax+=1
dec eaxeax-=1

논리 연산

and, or, xor, neg 등의 비트 연산을 지시, 비트 단위로 이루어짐

명령역할
and dst, srcdst와 src 각각의 비트가 모두 1이면 1, 아니면 0
or dst, srcdst와 src 각각의 비트가 하나라도 1이면 1, 아니면 0
xor dst, srcdst와 src 각각의 비트가 하나만 1이면 1, 아니면 0
not opop의 비트 전부 반전

비교 연산

두 피연산자의 값을 비교하고, 플래그 설정

cmp : 두 피연산자를 빼서 대소비교
test : 두 피연산자에 AND 비트연산을 취함

명령역할
cmp op1, op2op1과 op2를 비교(op1-op2)
test op1, op2op1과 op2를 비교(op1&op2)

분기

실행 흐름을 변경

명령역할
jmp addraddr로 rip을 이동
je addr직전에 비교한 두 피연산자가 같으면 addr로 rip을 이동
jg addr직전에 비교한 두 연산자 중 전자가 더 크면 addr로 rip을 이동

0개의 댓글