리버싱 공부하기 #1
반응형

안녕하세요


테라트입니다.


오늘은 원래 코드엔진 Basic 01 문제를 풀이하려고 했습니다만,


기본적으로 설명해야 할 것들이 있어서


그것들을 먼저 설명하고자 합니다.


오늘 알아볼 함수들은 JMP, JE, CMP 3가지 함수이고, 레지스터의 Flag 에 대해서 공부하려고 합니다.


리버싱 공부하기 글은 시리즈로서 앞으로 필요할 때마다 계속 해나가려고 번호를 붙였습니다.





자 그럼 시작해보겠습니다.


화이팅 :)




1. 레지스터의 Flag란?


Flag : CPU의 동작을 제어하는 값들로서, 0 또는 1의 값을 가진다.


이 Flag는 여러 종류를 가집니다. 올리디버거에서 Flag의 위치를 확인해보도록 하겠습니다.



위에 보이시는 빨간색 박스 안에 있는 값들이 모두 플래그 입니다. 정말 많죠? :(


천천히 하나씩 살펴보도록 하겠습니다. 설명에 앞서 설명은 설명인데, 이 정의를 줄줄이 외워야 한다기 보다는 그냥 C면 어떤 플래그이다. Z 이면 어떤 플래그이다. 풀네임 정도만 알고 계시면 좋을 것 같습니다. 그래서 저는 설명 또한 간단하게 하고 넘어가려고 합니다.


설명의 순서는 위에 사진에 보이는 순서대로 진행하겠습니다.


(1) C : Carry Flag로서, 자리 올림이 발생할 때 1로 발생하지 않으면 0으로 세팅된다.

(2) P : Parity Flag로서, 짝수일 경우 1, 홀수일 경우 0으로 세팅된다.

(3) A : Auximiliary Carry Flag로서, 10진수 연산시 자리올림 등이 발생하면 1로 발생되지 않으면 0으로 세팅된다.

(4) Z : Zero Flag로서, 연산 결과가 0 이면 1로 세팅되고, 0이 아니면 0으로 세팅된다.

(5) S : Sign Flag로서, 연산 결과가 음수면 1로 세팅되고, 음수가 아니면 0으로 세팅된다.

(6) T : Trap Flag로서, 프로세서를 처리할 경우 사용되는데, 0이 기본값이며, 1로 세팅되어 있을경우 1개의 명령씩 실행한다.

(7) D : Direction Flag로서, 문자열을 처리할 경우 사용되는데, 0이면 정방향으로, 1이면 역방향으로 처리한다.

(8) O : Overflow Flag로서, 연산 결과가 처리 수용량을 초과하였을 경우 1로 세팅된다.

(9) I : Interrupt Flag로서, 인터럽트 처리에 사용되는데, 0이면 외부 인터럽트 처리를 허용하지 않고, 1이면 외부 인터럽트 처리를 허용한다.

-> IF는 위의 사진에 플래그 종류에 포함되기에 소개를 하였습니다.


위에서도 언급했듯이 설명은 설명일 뿐 실습을 통해서 익히면 됩니다.


위에서 설명한 플래그들은 상태플래그와 제어플래그로 나뉘게 됩니다.


- 상태플래그 : CPU가 산술 및 논리 연산의 결과를 반영하는 플래그

: CF, PF, AF, ZF, SF,OF

- 제어플래그 : CPU 동작 상태를 제어하는 플래그

: DF, TF, IF


2. JMP 함수


JMP 함수는 어셈블리 JMP문 중 가장 기본이 되는 함수로서, 아무 조건없이 반드시 JMP를 수행합니다.


3. JE 함수


JE 함수는 플래그 값을 보고 JMP를 결정합니다.

JE, Jump is Equals의 약자로서 0이면 JMP하겠다는 뜻입니다.


결국, 위에서 설명했던 플래그 중 ZF가 1이면 JMP하겠다는 뜻이 됩니다.


4. CMP 함수


CMP함수는 간단하면서도 복잡한데, 두개의 값을 비교하여 플래그를 변경해주는 함수입니다. 간단하게 이야기하자면 값을 비교해주는 함수입니다.


Compare의 약자로 CMP 라는 이름을 가집니다.


CMP함수의 동작원리는 두 값의 뺄셈 연산으로서 비교를 하게 됩니다.

그래서 CF와 ZF 두 가지의 플래그가 사용되게 됩니다.


CMP A, B

> 이는 A-B의 연산을 함으로써 값을 비교하게 되는겁니다.


간단하게 표로 표현해봤습니다.




다음과 같이 생각하시면 됩니다.


다음 시간에는 코드엔진 Basic RCE 01 문제 풀이를 해보도록 하겠습니다.


반응형

댓글,

테라트

Since 2018.07.03 / IT 관련 정보, 일상의 공유를 위한 블로그