망각에 재주 있는 나를 위해 기록하는 곳.

[리버싱] 어셈블리 기초 정리 본문

리버싱

[리버싱] 어셈블리 기초 정리

baobabtree 2022. 5. 6. 05:47

표현방식

어셈블리어는 정해진 표준이 없다.

대표적으로 AT&T와 Intel 문법이 있다.

둘의 공통점은 Opcode와 Operand(Operand1, Operand2)로 표현한다.

Opcode는 명령어이다. Operand는 인자값(피연산자)이다. 

AT&T와 Intel의 차이가 있다.

Intel은 Operand2가 source Operand고, Operand1이 destination Operand이다. 즉 Operand2를 Operand1에 더하는 것이다.

AT&T는 그 반대로 Operand1이 source Operand고, Operand2가 destination Operand이다. 즉 Operand1을 Operand2에 더하는 것이다.

 

외에도 둘이 조금씩 표현에 차이가 있다.

  • 숫자

Intel: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 (우리가 알고 있는 숫자 그대로 표기)

AT&T: $1, $2, $3, $4, $5, $6, $7, $8, $9, $0 (숫자에 $가 붙은 형태)

 

  • 레지스터

Intel: rax, rbx, rcx, rdx (레지스터 이름 그대로 사용)

AT&T: %rax, %rbx, %rcx, %rdx (앞에 %가 붙은 형태)

 

  • 메모리 주소

Intel: [EAX] 

AT&T: (EAX)

 

  • offset

Intel: [EAX + 4]

AT&T: 4(EAX)

 

 

 

Opcode

PUSH

POP

MOV

LEA

ADD

SUB

INC

DEC

CMP

CALL

RET

NOP

 

 

 

 

레지스터

EAX(Extended Accumulator Register)

EBX(Extended Base Register)

ECX(Extended Counter Register)

EDX(Extended Data Register)

ESI(Extended Source Index)

EDI(Extended Destination Index)

ESP(Ectended Stack Pointer)

EBP(Extended Base Pointer)

 

 

여기서 하나 알아두면 좋을 것이

위에 레지스터는 모두 E가 붙어있다. E를 떼고 보면 AX, DX, CX 등 레지스터는 16bit 크기의 레지스터이다. 이후 32bit로 발전하면서 앞에 E(Extended)가 붙게 된것이다. 또 후에 64bit로 발전됨에 따라 앞에 R이 붙게 된다.

고로 앞에 어떤 글자가 붙었는지에따라 몇bit 크기의 레지스터인지 구분할 수 있다.

 

 

 

 

'리버싱' 카테고리의 다른 글

[리버싱] IAT  (0) 2022.05.03
[리버싱] 섹션 헤더, 섹션 데이터  (0) 2022.05.03