Did you know that you can navigate the posts by swiping left and right?
이용예시: ARPL [Dest] [Src]
Dest의 RPL1 필드와 Src의 RPL 필드를 서로 비교한다. Dest의 RPL 값이 Src보다 작으면, ZF(Zero Flag)의 값은 1이 되고, Dest의 RPL 값은 Src의 RPL 값으로 동일하게 된다. 권한 하락이 된다는 의미인것 같다. 이것을 코드로 표현하면 아래와 같다.
if(Destination.RPL < Source.RPL) {
ZF = 1;
Destination.RPL = Source.RPL;
} else
ZF = 0;
이용예시: CALL [함수주소]
위와 같이 사용하면, 다음 명령은 함수주소에 있는 명령어를 실행한다. JMP(Jump) 명령어와 다른 점은 콜백(Callback) 주소를 스택에 저장한다는 점이다. CALL 명령어를 사용하면, CALL 명령어 다음의 명령어 주소를 스택에 저장하고 피연산자인 함수주소로 넘어간다.
이용예시: CMP [Dest] [Src]
위의 명령어는 [Dest] - [Src] 과 같다. 이 연산의 결과는 ZF(Zero Flag)에만 영향을 미칠 뿐, Operand 자체에는 영향을 미치지 않는다. 이 명령어를 통해서 Dest와 Src가 완전히 같은지를 알 수 있으며, Dest - Src = 0 (완전히 같다)라면 ZF = 1 이 된다. 보통 JE 명령어와 함께 쓰인다.
이용예시: DEC EAX
위의 명령어 의미는, EAX의 값을 1빼서 EAX에 저장하라는 의미이다.
이용예시: INC EAX
위의 명령어 의미는, EAX의 값을 1더해서 EAX에 저장하라는 의미이다.
이용예시: LEA EAX, [EBP-34]
위의 명령어 의미는, [EBP-34]의 주소값을 EAX에 넣으라는 의미이다. 좌변에는 레지스터만 올 수 있다. MOV는 값 자체를 넣는 반면에 LEA는 주소값을 넣는다.
예를 들어 EBP의 값이 50이고 주소값은 0x0012F3F8 라고 할 때, LEA EAX, [EBP-34]를 실행하면 EAX에는 16이 들어가는 것이 아니라 0x0012F3D6 가 들어간다. (0x0012F3F8에서 34를 뺀 주소이다.)
이용예시: MOV [Dest] [Src]
위의 명령어 의미는, Src의 값을 Dest 값으로 복사해서 붙여넣으라는 의미이다. 그렇다면 [Dest] == [Src] 가 되겠지? MOV에는 아주 흥미로운 부분이 있는데 MOV EDI, EDI 라는 의미없는 명령어를 항상 Windows DLL 파일이 시작될 때 실행된다. Hot patch point 라는 이유 때문이다. 왜 MOV EDI, EDI를 사용했는지는 링크에 자세하게 나와있다. 추후에 이에 대해서 포스팅하기로 하겠다.
이용예시: POP EBP
스택에서 하나를 POP 해서 EBP에 저장하라는 의미이다. 스택은 LIFO 구조이기 때문에 스택의 가장 마지막에 넣은 값이 POP 된다.
이용예시: PUSH EBP
EBP에 있는 값을 스택에 집어넣는다는 의미이다. 스택은 LIFO 구조라는 것을 명심하자.
이용예시: PUSHAD
EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP 레지스터의 값을 스택에 PUSH한다. 레지스터의 값을 보관해야하거나 백업을 할 때 사용한다. EAX → ECX → EDX → EBX → ESP → EBP → ESI → EDI 순서대로 스택에 들어간다.
이용예시: RETN 8
stdcall 이란 함수호출규약에서 사용되는 방식이다. 위 명령의 의미는 RETN + POP 8bytes 이다. 즉, 리턴 후 8bytes 만큼 ESP를 증가시켜라는 것이다.
이용예시: TEST [Operand 1] [Operand 2]
위의 명령어 의미는, [Operand 1]과 [Operand 2]를 AND 연산 하라는 것이다. 이 연산의 결과는 ZF에만 영향을 미치고 Operand 자체에는 영향을 미치지 않는다. 보통 TEST EAX, EAX의 식으로 많이 사용하는데, EAX의 값이 0인지 확인할 때 사용된다. (0일 때만 결과값이 0이 나올테니깐 말이다.) 만약 TEST의 연산결과가 0이라면 ZF는 1로, 연산결과가 1이라면 ZF는 0으로 세트된다.
RPL이란 Request Privilege Level의 준말로 디스크립터를 통한 요청시의 권한이라고 번역할 수 있다. 세그먼트 레지스터 안에 있는 값이며 요구 특권 레벨 값이라고 할 수 있다. \(00{(2)}\) ~ \(11{(2)}\)까지 해서 0은 최대권한, 3은 최소권한 이다. ↩