안녕하세요
테라트입니다.
오늘은 원래 코드엔진 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 문제 풀이를 해보도록 하겠습니다.
CodeEngn Challenges : Basic 03 문제 풀이 (0) | 2018.07.28 |
---|---|
PE에 대해 공부하자 #1 (0) | 2018.07.10 |
CodeEngn Challenges : Basic 02 문제 풀이 (0) | 2018.07.09 |
CodeEngn Challenges : Basic 01 문제 풀이 (0) | 2018.07.07 |
올리디버거(OllyDbg) 설치 및 오류 설정 (0) | 2018.07.04 |
댓글,
테라트
Since 2018.07.03 / IT 관련 정보, 일상의 공유를 위한 블로그