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이면 주소로 이동함