어셈블리어란?
컴퓨터의 기계어와 치환되는 언어이다.
즉, 컴퓨터가 이해하는 기계어(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바이트 만큼 참조
|
'System Hacking > Basics' 카테고리의 다른 글
[시스템 해킹] gdb/pwndbg 사용법 (0) | 2025.03.07 |
---|---|
[시스템 해킹] pwndbg 설치방법 / Linux (0) | 2025.03.07 |
[시스템 해킹] 어셈블리어(assembly language) - 2/ 스택, 프로시저, 시스템콜 (0) | 2025.03.07 |
[시스템 해킹] Linux Memory (0) | 2025.03.06 |
[시스템 해킹] 컴퓨터 구조와 ISA (0) | 2025.03.05 |