리버싱

[드림핵] 5. x86 Assembly🤖: Essential Part(1)

코딩 못하는 공대생 2024. 5. 18. 04:16
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