티스토리 뷰

Reversing

어셈블리어 기초

07VH 2013. 1. 27. 13:58

Segment : Offset

컴퓨터는 BUS라고 불리는 일련의 전선을 통해 연결되어 있다고 한다. RAM으로 연결된 BUS는 16비트이다. 그래서 RAM에 자료를 쓰기 위해 프로세스는 16비트 로케이션을 BUS를 통해 보낸다. 허나 예전에는 메모리에 한계가 있었기 때문에, 디자이너들은 20비트를 BUS를 통해 보낼 수 있는 방법을 착안했다. 일단, 1MB를 허용하여 메모리는 바이트의 집합체인 Segment로 분리하였다. 그리고나서 그 Segment에 Offset번호를 지정함으로써 메모리에 접근하였다. 그래서 프로세서가 메모리에 접근할 때, 세그먼트 번호를 보내고 Offset번호를 보냈다. 이를 통해 물리적 주소를 구할 수 있는데, 방법은 다음과 같다.

Segment x 10h( h = 16진수임을 나타냄) + offset = 물리적 주소

예를 들어, Segment : Offset 주소가 1234 : 1234 라면 다음과 같다.

1234 x 10h + 1234 = 13574

레지스터

레지스터는 데이터를 저장할 수 있는 작은 영역이다. CPU는 메모리에 있는 데이터보다 레지스터에 있는 데이터에 휠씬 더 빨리 접근할 수 있다. 허나 레지스터에 있는 번호는 제한되어 있다. 이제 레지스터의 종류에 대해 알아보자. 시스템 해킹을 공부하는데 있어서 필수적인 부분이므로 반드시 이해를 해야 한다.

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

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

종류     구성                 용도

AX     AH, AL     수학 연산, I/O 연산, INT 21

BX     BH, BL     Base 또는 Pointer

CX     CH, CL    루프 및 반복

DX     DH, DL     다양한 데이터, 문자 출력

EAX   산술(덧셈, 곱셈, 나눗셈 등), 논리 연산을 수행하며 함수의 반환값 저장.

ECX   카운터 레지스터. 주로 반복 명령어 사용시 반복 카운터로 사용.

ESI     데이터를 조작하거나, 복사시에 소스 데이터의 주소가 저장.

EDI     복사 시에 목적지의 주소가 저장.

ESP   스택 프레임의 끝 지점 주소가 저장. PUSH, POP에 따라 ESP의 값이 4바이트씩 변함.

EBP   스택 프레임의 시작 지점 주소 저장. 현재 사용되는 스택 프레임이 소멸되지 않는 이상 값은 변하지 않음.

세그먼트 레지스터

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

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

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

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

그 외

Flag – 분기를 위해 사용됨. 크기가 1 비트.

ASM 명령어...

명령어는 개인적으로 많이 들여다 보고 공부해 보자... 스택이 쌓인 것을 보고 어떻게 돌아가는지, 또 어떻게 다시 리턴 어드레스로 돌아가는지 파악해 보자.

그럼 이만...

'Reversing' 카테고리의 다른 글

리버스 엔지니어링 문제풀이 2  (0) 2013.02.27
리버스 엔지니어링 문제풀이 1  (0) 2013.02.27
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함