본문 바로가기

OS-서버

어셈블리어 개념 정리

반응형


▣ 어셈블리어란?


컴퓨터와 1:1 대응이 되는 프로그래밍의 저급 언어(Low Level Language)다.



▣ 어셈블리어의 장점


- CPU를 직접 제어할 수 있다.

- 고급 언어로(High Level Language)로 구현할 수 없는 세부적인 부분까지 구현이 가능하다.

- 리버싱 엔지니어링, 악성코드 분석등 컴퓨터 보안과 관련된 다양한 분야에서 사용된다.


▣ 레지스터(Register)


1. 작은 데이터나 처리중인 중간결과를 임시적으로 저장해두는 영역이다.

2. CPU 내부에 존재하는 임시메모리로써 메모리 중 속도가 가장 빠르다.


▶ 32bits 범용 레지스터

EAX(Extended Accumulator Register) :주로 산술 연산에 사용하며, 함수의 리턴값이 저장되는 곳이다.

EBX(Extended Base Register) : 특정 주소를 저장하는데 사용. 간접 주소 지정자.

ECX(Extended Counter Register) : 반복적으로 실행되는 특정 명령에 사용. 반복 카운터.

EDX(Extended Data Register) : 주로 EAX보조로 사용되며 일반적인 자료를 저장. 입/출력 동작에 사용.


▶ 세그먼트 레지스터(16bits)

CS (Code Segment Register) : 실행될 기계 명령어가 저장된 메모리 주소 지정.

DS (Data Segment Register) : 프로그램에서 정의된 데이터, 상수 ,작업 영역의 주소 지정.

SS (Stack Segment Register) : 프로그램이 임시로 저장할 필요가 있거나 함수 호출에 관련된 정보를 저장한다.


▶ 포인터 레지스터(32bits)

EBP(Extended Base Pointer) : SS레지스터와 함께 사용되며 스택의 내의 변수 값을 읽는데 사용. 스택프레임의 기준점 주소.

ESP(Extended Stack Pointer) : SS레지스터와 함께 사용되며, 스택의 가장 끝 주소를 가르킴.

EIP(Extended Instruction Pointer) :다음 실행될 명령어의 주소가 저장됨.


▶ 인덱스 레지스터(32bits)

EDI(Extended Destination Pointer) : 목적지(사본 주소)에 대한 값 저장.

ESI(Extended Source Pointer) : 출발지(원본 주소)에 대한 값 저장.


▶ 플래그 레지스터(32bits)

EFLAGS(Flag Register) : 연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값을 저장.



▣ 어셈블리어 문법


1.인텔문법 

2.AT&T


▣ 레지스터 유형



□ AX 레지스터 - CPU가 16bit 시절일 때 생겨났음.

H = High L = Low (AL = 낮은 자리수 , AH = 높은 자리수)

   


□ EAX(Extended) - 32Bit로 확장된 레지스터

현대는 공간이 넓은 레지스터를 사용한다.


예를들어 Eax에 16진수값인 0012D687(1234567)을

넣었을 때 저장되는 형식은 다음과 같다.


EAX 

AX 

AH 

AL 

0012D687 

D687 

D6 

87 


AX안에 AH AL이 있다. EAX [ o  | AX ]



□ Rax(Revolution) 64bit로 확장된 레지스터



▣ 배경지식



1. 어셈블러는 크기를 잘 지켜줘야함.

mov AH , 1234 하면 안됨. 

기계어와 1:1 대응되기 때문에 정확한 명령어 구사가 필수임.


2. 프로세스란?

프로그램을 실행하여 메모리에 올라갔을 때 프로세스라고 함.


3. 램과 하드디스크의 관계


램은 머리로 기억하는것

하드디스크는 머리로 기억한 것을 종이따위에 기록한것이라 비유할 수 있다.


램이 커지면 즉슨 암산능력이 확장된것과 같다고 할수 있다.


속도는 당연히 머리로 기억한게 더 빠르지만 잊어버릴 가능성이 높다.


4. 데이터를 저장하는 방식


4-1. 리틀 엔디안

4-2. 빅 엔디안


빅엔디안 = 왼쪽 -> 오른쪽 (높은 자리수부터)

리틀엔디안(intel 계열) = 오른쪽 -> 왼쪽 (낮은 자리수부터)


장점 : 빅엔디안은 사람이 숫자를 읽고 쓰는 방법과 같기 때문에

메모리 주소 값을 보기 편함.


리틀엔디언은 컴퓨터가 계산하기에 효율적이다.

왜 그렇냐면

리틀엔디안은 메모리에 저장된 값의 하위 바이트들만 사용할 때

별도의 계산이 필요없다. 

예로 0x1A는 리틀엔디언으로 1A 00 00 00이라서 1A라는 값을 바로 얻을 수 있는 것처럼,

앞의 두 바이트 또는 한 바이트만 떼어내면 하위 16비트 또는 8비트를 바로 얻을 수 있다.


반면 빅엔디언은 예로 들자면 0x1A는 00 00 00 1A로 표기되고 1A에 해당하는 하위 바이트를

얻기 위해서 00을 3바이트를 더해야하는 것처럼 , 

하위 16비트나 8비트 값을 얻으려면 변수 주소에 2바이트 또는 3바이트를 더해야하는

번거로움이 생기게된다.


5. 메모리 주소 접근


mov [402000] , 50


다음과 같이하면 해당하는 메모리 주소에 접근해 값을 넣는다.


메모리 사이즈 지정할 때는 word dword 이렇게 함.


예를들어 mov [402000] , 0 라고 하면

Please Specify Operand size  - 한마디로 사이즈 지정해달래


그럼 mov dword ptr [402000] , 0 이런식으로 하면 됨


▷ 메모리 크기 구분

[Size] PTR DS(SS)

size = DWORD(4Byte) , WORD(2Byte) , BYTE(1Byte)

해당 주소에서 nByte를 읽는다.



6. 설정 파일


udd - 수정한 로그 파일들이 남는 폴더

Plugin - 옵션 설정값 파일들이 있는 폴더


7. 유용한 옵션


7-1. 코드가 어디로 점프하는지 보고싶다.

디버깅옵션에 CPU 탭에 Show jump to Selected Command 체크


7-2. File - attach = 실행중인 프로세스좀 보자


7-3. 우클릭 - New Origin here = 명령어를 재실행 할 수 있다.


7-4. 덤프창 메모리 값 바꾸는거 해당영역 드래그 후 Ctrl + E


7-5. NOP 수정할 때 Keep size 체크되어 있으면 수정 방지



8. jmp 동작원리


점프는 레지스터값 또는 메모리값을 이용해서 할 수 있다.

jmp ecx,

jmp ebx


mov dword ptr ds:[402000],00401002

jmp dword ptr ds:[402000]

점프할 위치랑 현재 명령어랑 거리가 가까우면 jmp에 short가 붙음.


jmp short 100000

EIP레지스터에 jmp 주소값을 덮어씌우지 않음.

애초에 EIP레지스터를 수정할 수 없음.


그러면 어떻게 점프하냐?

EIP 담겨진 주소랑 점프할 공간의 주소차를 이용해서 점프한다.


일단 EIP 레지스터에 다음 실행할 명령주소가 있다.


그 옆에 기계어 B8 00000000 가 있는데 읽어온 바이트수만큼 EIP가 증가하게됨.


메모리주소 기계어 명령어 

00375979 B8 00000000 mov eax,0

0037597E B9 00000000 mov ecx,0

00375983 BB 00000000 mov ebx,1

00375988 EB EF000000 jmp short 375979

0037598A ...



▷ 계산법 정리


EIP (375988) 기계어 읽기( EB EF - 2Byte 읽음)

읽은만큼 EIP에 더한다했음. 그럼 

375988 + 2Byte = 37598A 


EF가 현재 EIP에 더해야 할 숫자임

부호있는 16진수 EF는 -11이다. 계산은 EF를 2의보수로


37598A - 11 하면 375979가 된다.


※ offset(변위차) : 기준주소값에서 상대 거리



9. 파일 저장

메모리나 코드에서 패치한 내용은 재실행하면 사라지므로 파일로 저장한다.

패치된 문자열을 드래그한 후 우클릭 해서 Copy to executable file 메뉴를 선택한 뒤 Save file.



10. 프로그램 분석

10-1. 프로그램이 어떤언어로 작성됬는가

10-2. 어떤 동작을 하는가

10-3. 입력값이 어떤 영향을 미치는가


반응형