System Hacking/Basics

[시스템 해킹] 어셈블리어(assembly language) - 1/ 데이터이동, 산술연산, 논리연산, 비교, 분기

hanbunny 2025. 3. 7. 13:56

어셈블리어란?

컴퓨터의 기계어와 치환되는 언어이다.

즉, 컴퓨터가 이해하는 기계어(0과 1로 된 코드)와 거의 1:1로 대응되는 프로그래밍 언어임.

CPU 아키텍처에 따라 다른 문법과 명령어 세트(ISA)를 가진다.(x86, ARM, MIPS 등)

 


x64 어셈블리 언어

 

주요 명령어

데이터 이동

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

mov rax, 42      ; 즉시값 로드
mov rbx, rax     ; 레지스터 간 이동
mov rcx, [rax]   ; 메모리에서 레지스터로 이동
mov [rbx], rcx   ; 레지스터에서 메모리로 이동

 

산술 연산

덧셈, 뺄셈, 곱셈, 나눗셈 연산을 지시

add rax, rbx     ; 덧셈
sub rax, 10      ; 뺄셈
mul rbx          ; 곱셈 (RAX * RBX -> RDX:RAX)
div rbx          ; 나눗셈 (RDX:RAX / RBX)
inc rax          ; 증가
dec rax          ; 감소

 

논리 연산

and, or, xor, neg 등의 비트 연산을 지시

and rax, rbx     ; 비트단위 AND
or  rax, 0xFF    ; 비트단위 OR
xor rax, rax     ; 비트단위 XOR (레지스터 초기화에 자주 사용)
not rax          ; 비트단위 NOT

 

비교 / 점프

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

rip를 이동시켜 실행 흐름을 바꿈

cmp rax, rbx     ; 비교
je  label        ; 같으면 점프 (jump if equal)
jne label        ; 다르면 점프 (jump if greater)
jmp label        ; 무조건 점프

 

스택 연산

push rax         ; 스택에 값 저장
pop rbx          ; 스택에서 값 가져오기
call function    ; 함수 호출 (반환 주소 저장)
ret              ; 함수 반환
leave            ; 함수 에필로그 수행 (mov rsp, rbp 다음에 pop rbp와 동일)
enter size, nest ; 중첩된 프로시저를 위한 스택 프레임 생성 (잘 사용되지 않음)

 


피연산자

피연산자(operand)는 명령어가 작동하는 데이터나 그 데이터의 위치를 지정하는 부분이다.

명령어가 수행할 작업의 대상이 되는 값이나 주소를 의미함.

 

피연산자에는 즉시값, 레지스터, 메모리 가 올 수 있다.

 

즉시값이 머얌

-> 명령어 내에 직접 포함된 상수 값

mov rax, 42    ; 42가 즉시값 피연산자
add rbx, 10    ; 10이 즉시값 피연산자

 

레지스터가 머얌

-> CPU 내부의 저장 공간

mov rax, rbx   ; rbx가 레지스터 피연산자
add rcx, rdx   ; rcx와 rdx 모두 레지스터 피연산자

 

메모리가 머얌

-> 메모리 주소를 참조하는 피연산자

mov rax, [rbx]       ; [rbx]는 메모리 피연산자 (rbx에 저장된 주소의 내용)
add rcx, [rsi+8]     ; [rsi+8]은 메모리 피연산자 (rsi+8 주소의 내용)

메모리 피연산자

QWORD PTR [0x8048000]
0x8048000의 데이터를 8바이트만큼 참조
DWORD PTR [0x8048000]
0x8048000의 데이터를 4바이트만큼 참조
WORD PTR [rax]
rax가 가르키는 주소에서 데이터를 2바이트 만큼 참조