[정보 보안] 리버싱

[Reversing] 기초 이론_Assembly(어셈블리)_3

ITsubin 2022. 8. 22. 20:16

메모리 연산 명령어

> [ LEA  /  SCAS  /  STOS  /  REP ]

 

LEA

> Load Effective Address, MOV와 유사하지만 LEA는 주소 값을 복사하는 명령어이다.

 

SCAS

> Scan String, AL / AX / EAX에 저장되어 있는 값과 EDI에 저장된 주소를 참조한 곳의 값을 비교.

   (비교 후 Flag 값 설정)

 

STOS

> Store String, AL / AX / EAX에 저장되어 있는 값과 EDI에 저장된 주소를 참조한 곳의 값을 비교.

   (비교 후 Flag 값 설정)

 

REP

> Repeat String, ECX Register에 저장된 값 만큼 ECX가 0이 될 때까지 REP 뒤에 위치한 명령을 반복.


CODE 이동 명령어

> [ JMP  /  CALL  /  RET ]

 

JMP

> 무조건 주소로 이동. JMP [주소]의 형식으로, JMP 명령어로 해당 주소로 이동 가능.

> 조건을 설정하여 주소 이동도 가능.

> Ex) JMP 00401000

 

CALL

> 함수 호출 시 사용

> CALL 명령어가 실행되면 함수 종료 후 돌아올 주소를 스택에 백업하고 다른 함수로 EIP를 이동시킨다.

> [ PUSH EIP, JMP ] 두 명령어를 동시에 수행하는 것과 같다.

 

RET

> 함수의 종료 시 사용

> RET 명령어는 함수가 종료하여 Stack에 저장된 복귀 주소로 돌아간다.

> [ POP EIP,  ADD ESP, N ]명령을 동시에 수행하는 것과 유사.

   (POP EIP와 같이 직접 EIP의 값을 수정할 수는 없음)


조건 점프 명령

> Flag Register 값들을 이용해 조건이 만족하면 점프를 수행하는 명령어.

 

JA(Jump if (unsigned) above) : CF = 0 and ZF = 0

JAE(Jump if (unsigned) above or equal) : CF = 0

JB(Jump if (unsigned) below) : CF = 1

JBE(Jump if (unsigned) below or equal) : CF = 1 or ZF = 1

JC(Jump if carry flag set) : CF = 1

JCXZ(Jump if CX is 0) : CX = 0

JE(Jump if equal) : ZF = 1

JECXZ(Jump if ECX is 0) : ECX = 0

JG(Jump if (signed) greater) : ZF = 0 and SF = 0

JGE(Jump if (singed) greater of equal) : SF = OF

JL(Jump if (signed) less) : SF != OF

JLE(Jump if (signed) less or equal) : ZF = 1 and SF != OF

JNA(Jump if (unsigned) not above) : CF = 1 or ZF = 1

JNAE(Jump if (unsigned) not above or equal) : CF = 1

JNB(Jump if (unsigned) not below) : CF = 0

JNBE(Jump if (unsigned) not below or equal) : CF = 0 and ZF = 0

JNC(Jump if carry flag not set) : CF = 0

JNE(Jump if not equal) : ZF = 0

JNG(Jump if (signed) not greater) : ZF = 1 or SF != OF

JNGE(Jump if (signed) not greater or equal) : SF != OF

JNL(Jump if (signed) not less) : SF = OF

JNLE(Jump if (signed) not less or equal) : ZF = 0 and SF = OF

JNO(Jump if overflow flag not set) : OF = 0

JNP(Jump if parity flag not set) : PF = 0

JNS(Jump if sign flag not set) : SF = 0

JNZ(Jump if not zero) : ZF = 0

JO(Jump if overflow flag set) : OF = 1

JP(Jump if parity flag set) : PF = 1

JPE(Jump if parity is equal) : PF = 1

JPO(Jump if parity is odd) : PF = 0

JS(Jump if sign flag is set) : SF = 1

JZ(Jump is zero) : ZF = 1