Reversing/윈도우즈보안과악성코드기초

리틀 엔디안 표기법, Register 이해, assembly 언어

와븨 2024. 3. 23. 00:28

리틀 엔티안 표기법

바이트 오더링 : 컴퓨터에서 메모리에 데이터를 저장하는 방식

- Big Endian, Little Endian

 

Register의 이해

 

범용 레지스터

  • 4byte(32bit) 전체 사용 시 : EAX
  • 2byte(16bit) 사용 시: EAX의 하위 16BIT 부분인 AX
  • AX : 상위 1byte(8bit)AH + 하위 AL

 

 

플래그 레지스터

  • Zero Flag(ZF) : 연산 명령 후에 결과 값이 0인 경우에 1로 설정
  • Overflow Flag(OF)
    • 부호있는 수(Signed integer)의 오버플로우가 발생했을 때 1로 설정
    • MSB(Most Significant Bit)가 변경될 떄 1로 설정
  • Carry Flag(CF) : 부호없는 수 (unsigned integer)의 오버플로우가 발생했을 때 1로 설정
  • Sign Flag(SF) : 결과의 최상위 비트에 설정

 

컴퓨터 명령어 코드

명령어 구문

  • Op-code
  • Op-code Operand_1
  • Op_code Operand_1, Operand_2
오퍼랜드 설명
레지스터 EAX 읽고 쓰기 위해 사용되는 레지스터
0x1024 코드 안에 삽입된 직접적인 값(상수)
메모리 주소 [0x080349e] 메모리 주소값
(메모리 0x080349e)에 저장된 값을 나타냄)

 

어셈블리 명령어

  인텔 AT&T
레지스터 표현 EAX %eax
값의 표현 AABBCCDDh 또는 0xAABBCCDD %0xAABBCCDD
명령어 크기 표현 MOV movl(long형)
movb(byte형)
메모리 주소 [주소] (주소)
오퍼랜드 방향 목적지(dst)  ← 소스(src) 소스(src) → 목적지(dst)

 

데이터 이동 명령어

mov dst, src : 목적지로 값을 저장

  • mov eax, ebx
  • mov eax, 0x42
  • mov eax, [ebx]

 

lea dst, src : 메모리 주소를 목적지에 저장

  • lea eax, [ebx+8]

 

push / pop : 스택에 데이터를 넣음/꺼냄, EBP 감소/증가

  • push ebp
  • pop eax

 

산술연산 명령어

명령 설명 사용예
ADD 덧셈 ADD   ECX,10
SUB 뺄셈 SUB   ECX,5
INC 오퍼랜드 내용을 1 증가 INC   ECX
DEC 오퍼랜드 내용을 1 감소 DEC   ECX
MUL/IMUL EAX와 오퍼랜드를 곱셈하여 EAX에 저장 MUL   EDX
DIV/IDIV EAX와 오퍼랜드를 나누어 EAX에 저장 DIV   EDX
NEG 오퍼랜드의 2의 보수 (부호 반전) NEG   EAX

 

비트연산 명령어

명령 설명
AND 두비트가 모두 1이면 1, 나머지는 0으로 계산
OR 두 비트 중 하나라도 1이면 1, 아니면 0으로 계산
XOR 각 비트 값을 비교하여 값이 같으면 0, 다르면 1로 계산
NOT 비트 값을 반대 값(0→1, 1→0)으로 변경
SHL 왼쪽으로 쉬프트 연산
최하위 비트는 0으로 채워지고 기존 값은 CF 플래그 레지스터에 저장
SHR 오른쪽으로 쉬프트 연산
최상위 비트는 부호비트로 채워지고 CF 플래그 레지스터에 저장
ROL/RCL 왼쪽으로 쉬프트 연산, 최하위 비트는 최상위 비트로 채워짐
ROR/RCR 오른쪽으로 쉬프트 연산, 최상위 비트는 최하위 비트로 채워짐

 

제어 명령어

명령 설명 사용예
CMP 두개의 오퍼랜드 비교(뺄셈 연산 후 플래그 설정) CMP   EAX,0
TEST 두개의 오퍼랜드 비교(AND 연산 수행 후 플래그를 설정) TEST   EAX, EAX
CALL 해당되는 주소의 함수를 호출하여 수행 코드 위치로 옮김 CALL 00401990
INT 오퍼랜드로 지정된 예외 처리 수행
중단점으로 디버그용 소프트웨어 트랩
오버플로우 상황 시 발생하는 트랩
하드웨어 디버그 트랩 
INT 3
LEAVE 함수에서 사용한 지역변수 스택을 비움 LEAVE
RET 스택에 저장된 주소로 복귀 RET
NOP 아무 동작도 수행하지 않음(기계어코드 0X90) NOP

 

분기 명령어

- JMP : 무조건 EIP 주소값으로 점프

- JCC : CC(조건부코드) 값에 다라 해당 EIP 주소값으로 점프

- JE (Jump if equal), JNE (Jump if not equal)

 

반복

  • REP : ECX 레지스터 지정횟수 또는 ZF 플래그 조건에 맞을 동안 반복
    • REP : ECX가 0이 될 때까지 반복
    • REPE, REPZ : ECX가 0이거나 ZF가 0일 때까지 반복
    • REPNE, REPNZ : ECX가 0이 아니거나 ZF가 1일 때까지 반복
  • LOOP : LOOP 영역을 ECX 레지스터 지정 값만큼 반복
    • LOOP   주소   : ECX 카운터 감소시키고, 카운터가 0이 아니면 주소로 이동함
    • LOOPE   주소   : ECX 카운터 감소시키고, 카운터가 0이 아니고 ZF가 1이면 주소로 이동함
    • LOOPNE   주소   : ECX 카운터 감소시키고, 카운터가 0이 아니고 ZF가 0이면 주소로 이동함