728x90
어셈블리어와 x86-64
x64 어셈블리 언어
기본구조
- 명령어(Operation Code, Opcode) + 피연산자(Operand)
명령어
피연산자
- 상수(Immediate Value)
- 레지스터(Register)
- 메모리(Memory)
- 메모리 피연산자 : TYPE PTR [0x0000000]
- TYPE PTR : 크기 지정자
BYTE : 1바이트
WORD : 2바이트
DWORD : 4바이트
QWORD : 5바이트
x86-64 어셈블리 명령어
데이터 이동 (mov, lea)
- 어떤 값을 레지스터나 메모리에 옮기도록 지시
- mov dst, src : src에 들어있는 값을 dst에 대입
- lea dst, src : src의 유효 주소(Effective Address, EA)를 dst에 대입
산술 연산 (inc, dec, add, sub)
- add dst, src : dst + src 값
- sub dst, src: dst - src 값
- inc op : op의 값을 1 증가
- decop : op의 값을 1 감소
논리 연산 (and, or)
- and dst, src: dst와 src의 비트가 모두 1이면 1, 아니면 0
- or dst, src: dst와 src의 비트 중 하나라도 1이면 1, 아니면 0
논리 연산 (xor, not)
- xor dst, src: dst와 src의 비트가 서로 다르면 1, 같으면 0
- not op: op의 비트 전부 반전
비교 (cmp, test)
- cmp op1, op2: op1과 op2를 비교
두 피연산자를 빼서 대소를 비교 -> 어떤 ZF플래그가 설정되는지를 CPU가 보고 두 값이 같았는지 판단
[Code]
1: mov rax, 0xA
2: mov rbx, 0xA
3: cmp rax, rbx ; ZF=1
- test op1, op2: op1과 op2를 비교
두 피연산자에 AND 비트연산 -> 어떤 ZF플래그가 설정되는지를 CPU가 보고 두 값이 같았는지 판단
[Code]
1: xor rax, rax
2: test rax, rax ; ZF=1
분기
- jmp addr: addr로 rip를 이동시킵니다.
[Code]
1: xor rax, rax
2: jmp 1 ; jump to 1
- je addr: 직전에 비교한 두 피연산자가 같으면 점프 (jump if equal)
[Code]
1: mov rax, 0xcafebabe
2: mov rbx, 0xcafebabe
3: cmp rax, rbx ; rax == rbx
4: je 1 ; jump to 1
- jg addr: 직전에 비교한 두 연산자 중 전자가 더 크면 점프 (jump if greater)
[Code]
1: mov rax, 0x31337
2: mov rbx, 0x13337
3: cmp rax, rbx ; rax > rbx
4: jg 1 ; jump to 1
728x90
'리버싱' 카테고리의 다른 글
[드림핵] 6. Exercise: Helloworld (0) | 2024.05.18 |
---|---|
[드림핵] 6. x86 Assembly🤖: Essential Part(2) (0) | 2024.05.18 |
[드림핵] 4. Background: Windows Memory Layout (0) | 2024.05.18 |
[드림핵] 3. Background: Computer Architecture (0) | 2024.05.18 |
[드림핵] 2. Background: Static Analysis vs. Dynamic Analysis (0) | 2024.05.18 |