본문 바로가기

보안/리버싱

2. 메모리와 세그먼트 그리고 레지스터

* 이 글은 처음 접하는 사람을 위한 글입니다. 

개인적인 견해가 많으니 주의하시기 바랍니다.

오류가 있거나 다른 의견이 있으신 분은 메일로 보내주시고 댓글을 달아주시길 바랍니다. 

양해 부탁드립니다


메모리


메모리의 기본 단위는 1byte이다. 메모리에서 각 byte는 메모리 주소의 고유 숫자가 붙어 있다.


주 소 

 0

 1

 2

 3

 4

 5

 6

 7

 메모리

 2A

 45

 B8

 20

 8F

 CD

 12

 2E


word = 2 바이트 , double word = 4바이트 , quad word = 8 바이트 , paragraph = 16 바이트로 메모리의 모든 데이터는 숫자로 되어 있는데

문자들은 숫자를 문자로 맵핑하는 문자 코드로 저장이 된다. 유명한 ASCII(American Standard Code for Information Interchange) 가 있고


Unicode가 있다. 두 개의 차이는 아스키는 하나의 문자를 인코딩 하기 위해 1바이트를 사용, 유니코드는 한 문자당 2바이트(1 word)를 사용한다.


예를 들어,

ASCII는 A라는 문자에 4116 (6510) 바이트를 맵핑하고, Unicode는 word 004116를 맵핑한다. ASCII가 1바이트를 사용하기 때문에 단지 256 개의 다른 문자에만 국한되어 있다. 이에 반해 Unicode는 더 많은 문자를 재현할 수 있다고 한다.



Segment:Offset 


컴퓨터의 모든 것은 버스(BUS) 라고 하는 전선으로 연결되어 있는데 , RAM으로 연결 된 BUS는 16비트이다. 그래서 프로세스가 RAM에 자료를 쓸 필요가 있을 때 BUS를 통해 16비트 로케이션으로 보낸다. 


현재는 20비트 BUS를 통해 전달한다. 1MB의 메모리를 허용함으로써 메모리는 Segment 라고 불리는 바이트의 집합으로 분리 되었다.

그리고 그 세그먼트 내에 Offset 번호를 지정함으로 메모리에 접근하게 되었다.

프로세서가 데이터에 접근하려고 하면 세그먼트 번호를 보내어 Offset  번호가 뒤따르게 된다.


프로세서가 1234:2134(segment:offset)의 리퀘스트를 보내면 RAM은 세그먼트 번호 1234에 있는 2134 바이트를 보낸다.


물리적 주소를 구하는것은 


Segment x 10h(여기서 h는 이 수가 16진수라는 것을 가르킴) + offset = 물리적 주소 


1234:2134 = 1234 x 10h + 2134 = 14474 가 된다.



레지스터(Register)


CPU가 명령을 수행하는 물리적 장치인데 , 특별한 저장 영역에 있는 데이터를 요구하고 보통 레지스터는 데이터를 저장 할 수 있는

작은 영역이며, 파일을 저장하기엔 너무 작고 , 대신 프로그램이 실행되는 동안 어떤 정보를 저장하기 위해 사용 된다.


CPU는 메모리에 있는 데이터보다 레지스터에 있는 데이터에 훨씬 더 빨리 접근 할 수 있지만 레지스터의 번호는 제한되어 있다.


시스템에 대한 이해가 필수적이고 앞으로 매우 중요하므로 완벽하게 이해하고 넘어가자. 



* 일반적인 목적을 위한 레지스터

모든 일반적인 목적을 위한 레지스터는 16비트로 되어 있으며, 8비트 레지스터로 나누어질 수 있다. 예를 들어, AX는 AL 그리고 AH로 나누어질 수 있다. L은 low를 의미하고, H는 high를 의미한다. 만약 AX에 어떤 값을 부여하면 AH가 그 값의 첫 부분을 포함하고, AL은 마지막 부분을 포함한다. 예를 들어, 만약 AX에 DEAD를 부여하면 AH는 DE를, AL은 AD를 포함할 것이다. 마찬가지로 AH에 DE를, AL에 AD를 부여하면 AX는 DEAD를 포함할 것이다. 



종류  

 구성

 용도

 AX

 AH, AL

 수학 연산, I/O 연산, INT 21

 BX

 BH, BL

 Base 또는 Pointer

 CX

 CH, CL

 루프 및 반복

 DX

 DH, DL

 다양한 데이터, 문자 출력


386이 나왔을 때 4개의 새로운 레지스터가 추가되었는데, 그것은 EAX, EBX, ECX, EDX이다. 여기서 E는 32비트로‘Extended’(확장됨)를 의미한다. 다음 표를 보자. 각 공간은 8비트이다. 그리고 알아둘 것은 EAH 또는 EAL이라는 것은 없다. 



│              EAX             │



┼-----┼-----┼-----┼-----┼


 |        |        |  AH  |   AL  |


┼-----┼-----┼-----┼-----┼



 |       AX       |



세그먼트 레지스터

CS(Code Segment) – 코드를 저장하는 메모리 블록

DS(Data Segment) – 데이터를 저장하는 메모리 블록

EX(Extra Segment) – 비디오와 관련된 것을 위해 사용됨 

SS(Stack Segment) – 루틴으로부터 리턴 어드레스를 저장하기 위해 프로세서에 의해 사용되는 레지스터 



인덱스 레지스터:

SI(Source Index) – 문자열/배열의 소스를 지정하기 위해 사용됨. 

DI(Destination Index) – 문자열/배열의 목적지를 지정하기 위해 사용됨.

IP(Instruction Pointer) – 다음 명령의 주소를 저장하고, 그래서 직접적으로 변경될 수 없음.



스택 레지스터

BP(Base Pointer) – 스택 오퍼레이션을 위해 SP 와 연결되어 사용됨. 

SP(Stack Pointer)  



특별한 목적을 위한 레지스터

IP(Instruction Pointer) – 실행된 명령의 offset 를 가지고 있음. 

Flag – 분기(branching)를 위해 사용됨. 플래그 레지스터는 크기가 1 비트이다. 





'보안 > 리버싱' 카테고리의 다른 글

3. 기본 ASM  (0) 2019.01.09
1. 어셈블리어 기초 ( 수의 체계 )  (0) 2019.01.09