SISS/Assembly

Assembly의 시작

1. 어셈블리어 (Assembly) : 기계어를 일정한 규칙에 따라 문자에 대응시킨 저급언어. CPU와 직접적으로 대화할 수 있는 언어. 

# 기계어    :    CPU의 명령을 0과 1의 숫자로 바꾸어 놓은 언어. 

# 구성    :    명령어 (Operator) + 피연산자 (Operand)


1) 종류 : Intel 문법(Windows), AT&T 문법(Linux)

- Intel 문법 : 목적지(destination)이 먼저, 원본(source)이 그 뒤에    ☜ 우리는 Intel 문법으로

ex)     mov     eax (목적지), 1 (원본)

명령어     피연산자     ▶    eax에 1을 넣으라는 명령


- AT&T 문법 : 원본(source)이 먼저, 목적지(destination)이 그 뒤에

ex)     mov     1 (원본) eax (목적지)

명령어     피연산자     ▶    eax에 1을 넣으라는 명령



2) 어셈블러와 디버거

- 어셈블러 : 어셈블리어를 기계로 바꾸어주는 것.  ex) masm, nasm...

- 디버거 : 프로그램의 버그를 잡아주는 것.  ex) OllyDbg 

어셈블러마다 지시어가 모두 다르기 때문에 여기선 디버거를 사용



2. 디버거 올리디버거 설치하기 

www.ollydbg.de → Version 2.01 → Ollydbg (zip 파일을 바로 다운받을 수 있다.) 



zip 파일을 압축 해제하면 OLLYDBG.EXE 파일이 있는데 이 파일을 사용한다. 



실행할 때 항상 관리자 권한으로 실행시켜주어야하기 때문에 파일에서 오른쪽 버튼 > 호속성 > 호환성 > 관리자 권한으로 이 프로그램 실행을 눌러주면 바로 관리자 권한으로 실행시킬 수 있다. 





3. Ollydbg 시작하기


1) 간단한 컴퓨터 구조




- Register의 종류


① 범용 레지스터 (General Register) 

 80386 

레지스터

 이름

비트 

용도 

 EAX

 누산기 (Accumulator)

32

주로 산술 연산에 사용 (함수의 결과값 저장) 

EBX

베이스 레지스터 

(Base Register) 

32

특정 주소 저장 (주소 지정을 확대하기 위한 인덱스로 사용) 

 ECX

카운트 레지스터

(Count Register) 

32

반복적으로 실행되는 특정 명령에 사용 (루프의 반복 횟수나 좌우 방향 시프트 비트 수 기억) 

 EDX

데이터 레지스터

(Data Register) 

32

일반 자료 저장 (입출력 동작에 사용)


② 세그먼트 레지스터 (Segment Register)

 80386

레지스터

이름 

비트 

용도 

 CS

코드 세그먼트 레지스터

(Code Segment Register) 

16

실행될 기계 명령어가 저장된 메모리 주소 지정 

 DS

 데이터 세그먼트 레지스터(Data Segment Register)

16

프로그램에서 정의된 데이터, 상수, 작업 영역의 메모리 주소 지정 

 SS

 스택 세그먼트 레지스터

(Stack Segment Register)

16

프로그램이 임시로 저장해야 하는 데이터나 사용자의 피호출 서브 루틴이 사용할 데이터와 주소 저장 

 ES, FS, GS

 엑스트라 세그먼트 레지스터(Extra Segment Register)

16

문자 연산과 추가 메모리 지정을 위해 사용되는 여분의 레지스터 

 


③ 포인터 레지스터 (Pointer Register)

 80386

레지스터

이름 

비트 

용도 

EBP

 베이스 포인터

(Base Pointer)

32

SS 레지스터와 함께 사용되어 스택 내의 변수값을 읽는 데 사용

ESP

스택 포인터

(Stack Pointer)

32

 SS 레지스터와 함께 사용되며 스택의 가장 끝 주소를 가리킴

EIP

명령 포인터

(Instruction Pointer) 

32

다음 명령어의 오프셋(Offset, 상대 위치 주소)을 저장하며 CS 레지스터와 합쳐져 다음에 수행될 명령의 주소 형성


④ 인덱스 레지스터 (Index Register)

 80386

레지스터

이름 

비트 

용도 

EDI

목적지 인덱스

(Destination Index)

32

목적지 주소에 대한 값 저장

ESI

출발지 인덱스

(Source Index)

32

출발지 주소에 대한 값 저장


⑤ 플래그 레지스터 (Flag Register)

 80386

레지스터

이름 

비트 

용도 

 EFLAGS

플래그 레지스터

(Flag Register)

32

연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값 저장



⑥ 연산장치 관련 레지스터

 80386

레지스터

용도 

누산기 (Accumulator)

EAX

데이터 레지스터 (Data Register)

EDX

상태 레지스터 (Status Register)

EFLAGS


⑦ 제어장치 관련 레지스터

 80386

레지스터

용도 

프로그램 카운터 (Program Counter)

ECX

명령 레지스터 (Instruction Register)

EIP

메모리 주소 레지스터 (Memory Address Register)

EBX, EBP, ESP, EDI, ESI 등

메모리 버터 레지스터 (Memory Buffer Register)

프로그램 실행과 관련된 데이터를 저장하는 레지스터로

RAM의 역할을 한다.



2) 올리디버거의 간단한 사용법

- 올리디버거 사용하기

☆ empty.exe 파일은 밑에 적어놓은 스무디TV님의 강좌 설명란에 가면 받을 수 있다. 


① empty.exe 파일을 올리디버거로 열면 다음과 같은 창이 뜬다. 맨 왼쪽에 있는 숫자(00401000) 부분은 주소값이다. 



② 맨 윗줄의 RETN 부분을 더블클릭하면 우리가 어셈블리어를 적을 수 있도록 "Assemble"이라는 창이 뜬다. 위에서 예시로 들었던 mov eax, 1을 넣어보았다. 



③ 주소값 부분이 검정색으로 바뀌면서 우리가 입력했던 mov eax, 1 이라는 어셈블리가 화면에 나타났다. 

# 주소값 부분이 검정색인 것은 아직 실행되지 않았다는 의미



④ 한 칸 아래로 가는 화살표 (Step Over) 를 눌러보자. 



⑤ 주소값이 노란색으로 변하고 오른쪽에 EAX 0000001 이 나타난다. 이는 어셈블리가 실행되어 EAX 레지스터에 1이 들어갔음을 의미한다. 





(스무디TV 강의 1, 2강 

https://www.youtube.com/watch?v=Q8xCTztsRmw&list=PL1IheunyylbaYAzQv8bdu3hxq8YX5cKlY

정보보안개론과 실습, 한빛 미디어, 양대일 참고) 




'SISS > Assembly' 카테고리의 다른 글

증감 명령어  (0) 2018.07.28
JMP 명령어  (0) 2018.07.22
메모리 크기 지정과 저장방식  (0) 2018.07.18
메모리 주소와 접근  (0) 2018.07.18
범용레지스터와 메모리  (0) 2018.07.16