5. 어셈블리어
본문 바로가기
Reversing & Cheat Engine

5. 어셈블리어

by boosting 2024. 2. 19.
728x90

[이전글] - 4. 치엔 튜토리얼 Step 2

1. 어셈블리어

 

컴퓨터 내부에 있는 CPU라는 장치가 있습니다. 이 CPU에서는 각 프로세스들에게

명령을 내리기 위한 고유의 명령어 세트가 있는데 이를 기계어라고 부릅니다.

이 기계어는 한번쯤 들어보셨을 2진법, 즉 0과 1로만 구성이 되어 있습니다.

그런데 이 기계어는 사람이 이해하기는 힘든 구조이기에 이를 위해 좀 더 이해하기

쉬운 기호 코드로 나타낸 것을 말합니다.

 

기계어와 1대1로 대응된 명령를 기술하는 언어라는 뜻입니다.

이 언어의 경우 1가지 만의 명령을 수행하기 때문에 어떤 명령을 수행하는지

추상적으로 볼 수 있는 게 아니라 직접적으로 확인할 수 있습니다.

프로그램 논리상의 오류라든지 동작 과정 등을 명확하게 볼 수 있다는 점에서

직관적인 언어라고 볼 수 있습니다.

 

이 언어에 대해 이해를 하는 것은 내부 메모리에 대한 이해도도 많이 올라가기 때문에

최소한으로라도 알아두면 좋은 언어이고 Cheat Engine을 다루실 거라면 필수적으로

익히고 있어야 하는 언어라고 할 수 있습니다.

 

2. CPU 레지스터 종류

CPU 내부의 기억장소로써 컴퓨터가 정보를 처리하기 위해선 특별한 셀에

저장이 되어 있어야 합니다. 이러한 셀을 레지스터라고 부르고 있습니다.

레지스터의 종류에는 범용, 상태, 플래그 3가지의 경우로 나뉘어집니다.

우선 범용 레지스터에는 4가지가 있습니다.

 

1

EAX는 32Bit의 크기를 가지고 있으며 이를 반으로 쪼개면 16Bit인 즉 AX가 되고

AX를 반으로 쪼개면 0000 / 0000 기준으로 앞이 AH가 되고 뒤가 AL이 됩니다.

이와 비슷한 성격의 레지스터가 3개 더 있는데 정리를 하면 다음과 같습니다.

 

EAX, EBX, ECX, EDX 이렇게 4개가 있습니다.

각 4개마다 주요의 기능은 있지만 쉽게 생각하면 사용자가 자유롭게 Value 나 Address 등

변수 데이터를 자유롭게 집어넣을 수 있는 공간이다라고 생각하시면 편할 거 같습니다.

 

EAX의 경우 대체로 함수 결괏값을 저장하는 레지스터로 많이 사용됩니다.

EBX의 경우 베이스 레지스터라 불리며 주소 지정에 많이 사용됩니다.

ECX의 경우 Loop나 for문과 같이 반복문 실행 시에 많이 사용됩니다.

EDX의 경우 데이터 레지스터라 불리며 EAX와 함께 쓰이면서 부호 확장에 많이 사용됩니다.

 

다음으론 포인터 레지스터인 ESP와 EBP가 있고 인덱스 레지스터에 EDI와 ESI가 있습니다.

2

ESI, EDI, ESP, EBP는 위의 범용 레지스터처럼 8Bit까지 쪼개지지는 않기에 SX 등은 없습니다.

ESI의 경우 많은 양의 메모리를 옮기거나 비교할 때 그 소스의 주소를 가리킵니다.

EDI의 경우 많은 양의 메모리를 옮기거나 비교할 때 그 목적지의 주소를 가리킵니다.

ESP의 경우 스택 포인터라 부르며 스택의 최종 지점을 저장하는 곳입니다.

EBP의 경우 ESP을 대신하여 스택에 저장된 함수의 지역 변수 주소를 가리킵니다.

 

이외에 세그먼트 레지스터엔 CS, SS, DS, ES 가 있습니다.

세그먼트 레지스터까지 설명을 달아두기엔 자주 사용되는 용도는 아니라 여기선 넘기겠습니다.

마지막으로 상태 레지스터인 EIP가 있습니다.

EIP 역시 ESI처럼 16Bit까지만 쪼개지며 EIP의 경우 현재 실행된 프로그램의 실행 명령어가

저장되어 있는 레지스터라 볼 수 있습니다.

 

3

 

다음에서 보시면 현재 실행되어야 할 주소가 1000400E3 이기에 EIP는 1000400E3이 됩니다.

그런데 위의 스크린샷을 보면 EDI ESI EBP ESP 가 아니라 R이 붙어 있습니다.

위에서 기술한 것들은 32Bit 프로그램들에서의 레지스터이며 64Bit 프로그램들에서는 RAX로 R이 붙습니다.

복잡하게 생각할 것 없고 RAX = EAX의 2배라고 생각하시면 되고 쪼개어지는 건 다 똑같습니다.

그리고 별도로 64Bit 프로그램들에서는 주소값이나 데이터값들이 워낙 크기 때문에 추가적으로 사용하는

보조 레지스터들이 있는데 이는 r8~r15까지 있습니다.

 

마지막으로 상태 플래그 레지스터가 있는데, 이는 앞으로 많이 보게 되실 조건문에서

많이 사용됩니다. 즉 어떤 명령어의 연산 결과에 따른 결괏값을 토대로 플래그에 신호를

주게 되어 이 플래그값으로 명령어를 수행할지 말지를 결정하는 것이죠.

 

플래그 레지스터 역시 말로만 설명하기엔 애매한 부분이 있어서 한번 읽어보실 분은

https://pwn3r.tistory.com/entry/Flag-Register-1

 

Flag Register

1) Flag register Flag register는 CPU 내부 기구중 하나로 산술 연산 결과의 상태를 보여주는 flag bit들이 모인 레지스터이다. 산술 연산시 CPU에 의해 자동적으로 세팅되며 , 프로세서의 현재 상태를 결정

pwn3r.tistory.com

 

여기 한번 가셔서 아 이런 게 있구나 정도만 알아두시면 좋을 듯합니다.

 

레지스터들을 알았으니 이제 레지스터들을 다룰 때 사용되는 명령어들을 알아야겠죠.

다음 시간에는 명령어들을 순차적으로 다뤄보도록 하겠습니다.

 

 

6. 어셈 명령어

1. 명령어의 구성 이전 글을 쭉 봐오셨다면 add와 sub, mov 등의 명령어들을 보셨을 겁니다. 못 보셨다면 이 글을 한 번 쭉 읽어보시면 명령어들을 간략하게나마 볼 수 있을 것입니다. 4. 치엔 튜토리

poppinss.tistory.com

 

728x90

'Reversing & Cheat Engine' 카테고리의 다른 글

7. 치엔 게임 튜토리얼 Step 3  (0) 2024.02.20
6. 어셈 명령어  (0) 2024.02.19
4. 치엔 게임 튜토리얼 Step 2  (2) 2024.02.19
3. 치엔 게임 튜토리얼 Step 1  (0) 2024.02.17
2. Cheat Engine 설치 및 세팅  (2) 2024.02.17