정보보안

레지스터, 스택과 어셈블리어 명령어

Sweetft 2022. 4. 6. 12:04

 

레지스터

레지스터 : cpu 내부 존재하는 다목적 저장 공간, CPU가 고속으로 데이터를 처리하는 것을 가능하게 한다.

메모리스택 : 중앙 처리 장치와 붙어 있는 RAM의 일부분

CPU(마이크로 프로세서)의 구성 : 레지스터, 연산장치, 제어장치

 

- 레지스터의 종류

- General Purposer Registers

레지스터 용도
EAX 산술연산에 사용, 함수 리턴값
저장 하는 변수의 용도로 사용
ECX 반복 카운트
EDX 자료보관용
EBX 자료임시보관시 사용
ESP 스택 포인터(주소를 가리킴)
EBP 스택 프레임의 기준점
ESI 자료임시보관시 사용
EDI 자료임시보관시 사용

 

 

스택

LIFO(Last In First Out)

자료구조에서 기억 장치에 데이터를 일시적으로 겹쳐 쌓아 두었다가 필요할 때 꺼내 사용할 수 있도록 주기억장치나 레지스터의 일부를 할당해 사용하는 기억장치

EBP : 스택의 바닥은 몇 번지니?

ESP : 현재의 탑은 몇 번지니?

EAX : 함수리턴값, 데이터 저장(POP이 일어나면 EAX에 데이터를 넣음)

스택의 구조의 이해를 돕기 위해 ollydbg로 실습한 화면이다.

EAX, ECX, EDX, EBP 등 레지스터들이 사용되는 모습을 볼 수 있으며 EBP와 ESP가 나타내는 주소를 보면 스택의 TOP과 BOTTOM 또한 확인이 가능하다.

 

 

어셈블리어명령어

어셈블리어: 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어

1.INC(증가), DEC(감소)
형식 : INC/DEC [operand]
의미 : [operand] 값에 1을 증가/감소 시킨다
*operand : 피연산자
 
2.ADD(덧셈), SUB(뺄셈)

형식 : ADD [operand1] [operand2]

의미 : operand1 = operand1 + operand2   

(operand1 과 operand2 를 더한 값을 operand1에 저장)

 

형식 : SUB [operand1] [operand2]

의미 : operand1 = operand1 - operand2   

(operand1 과 operand2 를 뺀 값을 operand1에 저장)

 

e.g. SUB EAX,5   => EAX = EAX-5

e.g. ADD EAX,10 => EAX = EAX+10

 

3.CMP(비교)
형식 : CMP [Destination Operand] [Source Operand]
의미 : Source operand의 값과 Destination operand의 값을 비교한다.
e.g. CMP ECX,EAX --- EAX의 값은 ECX와 같다.
두 값이 같다면 Z Flag=1, 다르면 Z Flag=0이다.
 
4.JMP(점프-이동)
형식 : JMP [code address]
의미 : 다음 처리를 위해 code address로 이동한다.
e.g.
2000000 JMP 2000024
2000004 ADD EAX,50
2000008 RTN
2000020에 있는 명령은 실행하지 않고 무조건 2000016에서 2000024로 이동해서 RTN을 실행한다.
 
5.CMP-JNZ(코드 이동)

형식 : CMP A,B

         JNZ [code address] //Z Flag의 값이 0인 경우

의미 : A와 B의 값이 다른 경우 code address로 이동한다.

e.g.

ECX 00000050
EAX 00000050
20000000 CMP ECX, EAX
20000004 JNZ 2000000C
20000008 ADD EAX, ECX
2000000C RTN
=> 20000000에서 ECX와 EAX를 비교한다. -> 비교한 값의 Z Flag가 1이기 때문에 2000000C로 이동하지 않고 20000008로 이동한다. -> 20000008의 명령을 실행한다.
이때 EAX에 저장된 값은 00000100
 
6.CMP-JE(코드 이동)
형식 : CMP A, B
        JE [code address] //Z Flag의 값이 1인 경우
의미 : A와 B의 값이 같은 경우 code address로 이동

e.g.

ECX 00000050
EAX 00000050
20000000 CMP ECX, EAX
20000004 JE 2000000C
20000008 DEC ECX
2000000C RTN
=> 20000000에서 ECX와 EAX를 비교한다. -> 비교한 값의 Z Flag가 1이다. -> 2000000C로 이동하는 명령을 수행한다.
이 때, ECX의 값은 00000050이다.

 

6.NOP(코드 이동)

NO OPERATION  : 실행하지 않음!

 

 

참고 : 정보보안(22년-1학기) 고수정 교수님 강의 및 강의 자료 변형, 요약