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 |