리버싱/리버싱 입문

리버싱 입문 1장 6. 어셈블러 기초 지식

상세 2021. 3. 10. 23:32

1. 어셈블러의 개요

어셈블러 : 컴퓨터가 이해할 수 있는 연속적인 비트로 구성된 기계어를 사람이 알아볼수 있도록

만든 일종의 매크로 모음. 어셈블러와 기계어는 1:1로 매칭됨

 

2. 어셈블러 기본 구조

 

어셈블러 명령어는 최대 3개까지 인자를 받아들일 수 있음.

 

1) 2개의 인자를 사용하는 명령어

ADD

예) ADD EAX, EBX -> EAX레지스터의 값에 EBX 레지스터 값을 더해 EAX 레지스터에 다시 저장하는 동작

고급 언어 : EAX = EAX + EBX

헥사 코드 : 01D8

 

2) 1개의 인자를 사용하는 명령어

INC

INC ESI -> 인자로 오는 ESi 레지스터 값을 1만큼 증가

고급 언어 : ESI = ESI +  1

헥사 코드 : 46

 

PUSH

뒤에 오는 인자를 스택의 맨 위에 입력함

PUSH 0 -> 스택의 맨 위에 0000_0000을 입력한다. 

헥사 코드 : 6A 00 (00은 인자로 오는 0을 그대로 사용함)

고급 언어 : 스택과 관련한 명령어가 따로 없음

 

3) 인자가 없는 명령어

RETN

단 뒤에 하나의 인자를 입력 받을수도 있음

RETN -> 스택의 맨 위에 있는 값을 EIP 레지스터(다음에 실행할 명령어를 저장하는 역할)에 저장하는 역할을 함

운영체제는 프로그램이 사용하는 EIP 레지스터를 사용해서 다음에 어떤 명령어를 실행할지 결정.

즉 스택의 맨 위 주소에 있는 명령어를 실행