R136A1

어셈블리어 본문

REVERSING

어셈블리어

r136a1x27 2021. 2. 17. 20:57

구조

명령어   피연산자1, 피연산자2, 상수

opcode  operand1,  operand2, immediately

 

데이터 크기 표현

[부호X]

BYTE      1 BYTE

WORD   2 BYTE

DWORD 4 BYTE

QWORD 8 BYTE

[부호O]

SBYTE     1 BYTE

SWORD   2 BYTE

SDWORD 4 BYTE

SQWORD 8 BYTE

 

피연산자 종류

mem (memory) 메모리

        label 지정된 레이블(특정 구간을 만들 수 있다)

imm (immediately) 즉시 값(상수) 0x__

reg (register) 범용 레지스터

 

명령어 opcode

INC increase 피연산자 +1

DEC decrease 피연산자 -1

ADD Destination에 Source값을 더해서 Destination에 저장

ADC ADD+CARRY, Carry에 있는 값까지 더하기 (뭐지...)

SUB Destination에 Source값을 빼서 Destination에 저장

SBB SUB-CARRY, Carry에 있는 값까지 빼기

MUL 피연산자에 따라 (부호없이) 특정 레지스터 값을 곱함 / 결과에 따라 OF, ZF가 세트

        8bit × AL => AX 저장

        16bit × AX => DX:AX 저장 //최대 32bit로 상위 16bit는 DX에, 하위 16bit는 AX에 저장

 

m.blog.naver.com/shackerz/220441094174

gyeongje.tistory.com/9

MOV Destination에 Source 데이터를 복사

MOVZX Destination에 Source 데이터를 복사하고 도착지의 남은 비트를 0으로 채운다 (*단, 부호 없을 때만 사용)

MOVSX Destination에 Source 데이터를 복사하고 도착지의 남은 비트를 부호비트로 채운다 (*단, 부호 있을 때만 사용)

LEA Destination에 Source 주소를 복사

 

CMP Compare ZF와 세트로 두 피연산자를 비교하여 같으면 CMP값은 0 ZF는 1 / 다르면 CMP값은 1 ZF는 0

                              CF와 세트로 두 피연산자를 비교하여 앞이 크면 0 작으면 1

                              비교: 첫번째 피연산자 - 두번째 피연산자

TEST Test 피연산자끼리 AND연산하여 플래그를 세팅, 보통 해당 값의 참, 거짓을 판별 시 사용

           보통 함수의 리턴값과 특정 값 0, 1 을 연산하여 같은지 비교할 때 씀 (CMP와 달리 값 저장 없이 ZF만 세팅)

                      ZF와 세트로 두 피연산자를 비교하여 같으면 ZF는 1 / ZF는 0

// CMP, TEST는 FLAG를 세팅하기때문에 분기문에 영향을 줄 수 있는 것이다.

 

JMP jump 원하는 레이블로 이동 //일종의 분기문. FLAG를 참조해 IF의 역할을 함

JA jump if above CMP로 두 값 비교 시 > 면 JMP

JB jump if below

JE jump if equal == JZ jump zero // CMP의 값이 같아서 ZF(Zero Flag)가 1로 셋팅된 경우

JAE == JNB

JBE == JNA

JNE == JNZ

 

CALL 함수 호출 시 사용, JMP와 같이 프로그램 실행 흐름이 변경되지만

        return address 를 스택에 저장해 호출 후 원래 위치로 되돌릴 수 있음

 

LEAVE

mov esp, ebp

pop ebp

 

RET

pop eip

jmp eip

플래그 flag

1 setting / 0 clear

ZF Zero Flag 연산 결과가 0인가 표시( 0이면 1, ZR(zero) / 1이면 0, NZ(not zero) )

OF Overflow Flag 음수 연산에서 연산 결과가 주어진 레지스터 길이를 초과할 때 1

CF Carry Flag 양수 연산에서 연산 결과가 주어진 레지스터 길이를 초과할 때 1

- - - - -

AF Anxiliary carry Flag 10진수 덧셈, 뺄셈 연산에서 보정이 필요할 때 자리 올림/내림

PF Parity Flag 연산 결과 1(binary)이 짝수개임

SF Sign Flag 연산 결과가 음수일 때

DF Direction Flag 문자열 관련 명령에 사용 - enable 역방향 접근 / disable 순방향 접근

 

제어 플래그 Control Flag CPU동작 제어, 문자열 처리명령의 제어

 

범용 레지스터 (4byte)

일반 레지스터_데이터 저장

일반 레지스터는 위와 같이 나누어 사용 가능(효율성, 호환성)

EAX 산술, 논리연산, 또는 함수의 반환값 저장

EDX 부호 확장 명령 - 큰 수의 곱셈 또는 나눗셈 연산 (EAX와 함께)

 

ECX 카운터 레지스터. 반복 명령어 시 횟수 저장

 

EBX 메모리 주소를 저장 (ESI, EDI 레지스터와 결합하여 사용)

      ㄴ주소 지정 방식 1. 직접지정(JMP 1000) 2. 간접지정(JMP EBX)

- - - - - - - - - - -

일반 주소 레지스터

Pointer Register(포인터 레지스터) 스택 관련

EBP 스택 프레임의 처음 메모리 주소 저장

ESP 스택 프레임의 끝 메모리 주소 저장 *PUSH POP 명령에 따라 4Byte씩 유동

스택: 지역 변수가 할당되는 곳 / 스택프레임: 함수를 호출하면 생기는 프레임

 

Index Register(인덱스 레지스터) 문자열 관련

ESI 데이터 조작하거나 복사 시 원본 데이터의 메모리 주소 저장

EDI 데이터 조작하거나 복사 시 목적지의 메모리 주소 저장

 

Segment Register(세그먼트 레지스터) 세그먼트 주소 담겨있음

CS Code Segment 코드 세그먼트의 시작번지

                         IP(Instrunction Pointer) 레지스터가 가진 offset값과 함께 실행을 위한 명령어의 주소를 참조하게 됨

SS Stack Segment 스택 세그먼트의 시작번지

                         SP 혹은 BP 레지스터가 가진 offset값과 함께 스택 영역의 주소를 참조하게 됨

DS Data Segment 데이터 세그먼트의 시작번지

                         AX, CX, DX, SI, DI 레지스터가 가진 offset값과 함께 데이터 영역의 주소를 참조하게 됨

 

 


m.blog.naver.com/shackerz/220464261071

배열

char ch[6] = "hello";

 

DWORD PTR DS:[주소]

- DWORD: 4byte 공간 / PTR / DS:[주소]

- data 영역 해당 주소에 있는 4 byte 공간의 값

 

WORD PTR SS:[주소]

- WORD: 2byte 공간 / PTR / SS:[주소]

- stack 영역 해당 주소에 있는 4 byte 공간의 값

 

MOV ①,②

①공간에 ②값을 저장

*DWORD 4byte 크기면 E□X *WORD 2byte 크기면 X

 

 

 

 

 

 

Comments