본문 바로가기
Reversing

Reversing 0주차 - 32bit Register

by 몰라몰라개복치 2020. 9. 8.

 

1. 32bit Register

 

CPU 레지스터란 ?

 

레지스터란 CPU 내부에 존재하는 다목적 저장공간이다. CPU와 한 몸이기 떄문에 고속으로 데이터를 처리할 수 있다. 레지스터는 범용 레지스터, 세그먼트 레지스터, 상태 플래그 레지스터, 명령 포인터 레지스터로 나눌 수 있다. 오늘은 범용, 세그먼트 상태 플래그 레지스터에 대해 알아보려 한다.

 

 

 

 

(1) 범용 레지스터 ( General Purpose Registers )

 

쉽게 막 쓰는 레지스터들이라고 생각하면 된다. IA-32에서 각각의 범용 레지스터들은 32비트씩 8개가 있다.

보통은 상수(연산 처리, 연산 결과), 주소 (번지 지정, 복귀 주소) 등작은 데이터의 임시 저장 공간으로 쓰인다.

 

 

 

 

 

8개의 범용 레지스터가 있고 각 레지드터들은 16비트 하위 호환을 위하여 몇 개의 구획으로 나뉘어진다

 

 

가장 위에있는 EAX로 봤을때 ( 1byte = 8bit )

32비트 (0~31)를 전부 다 사용하고 싶을때는 EAX를,

16비트 (0~15)만 사용하고 싶을때는 AX를,

AX는 다시 상위 8비트 AH 하위 8비트 AL로 나뉘어진다.

 

 

 

아래 4개의 레지스터들은 주로 산술연산 ( ADD, SUB, XOR, OR 등 ) 명령어에서 상수나 변수 값의 저장 용도로 많이 사용된다.

 

 EAX ( Accumulator Register ) : 산술, 논리 연산을 할때 사용되며 함수의 리턴 값을 저장.

 EBX ( Base Register ) : 메모리 주소를 저장.

 ECX ( Count Register  ) : 우리가 흔히 아는 반복문에서 카운트로 사용.

 EDX ( Data register ) : 보통 EAX와 함께 연동해서 사용하며, 큰수의 복잡한 연산 과 부호 확장 명령에 사용.

 

아래 4개의 레지스터들은 주로 메모리 주소를 저장하는 용도로 많이 사용된다.

 

 EBP ( Base Pointer Register ) : Stack의 시작 주소 저장.

 ESP ( Stack Pointer Register ) : Stack의 끝지점 주소가 저장. push pop 에 따라 4byte씩 값이 변한다.

 ESI ( Source Index Register ) : 데이터를 조작하거나 복사할 때 데이터의 주소 저장.

 EDI ( Destination Index Register ) : 데이터를 복사할 때 목적지의 주소 저장.

 

 

 

 

 

 

 

(2) 세그먼트 레지스터 ( General Purpose Registers )

 

세그먼트란 메모리를 조각내어 각각의 조각마다 시작 주소, 범위, 접근 권한 등을 부여하여 메모리를 보호하는 기법을 말한다.

 

 

16비트(2바이트) 크기의 레지스터 6개로 구성되어 있습니다.

 

CS : Code Segment / 함수나 제어문 같은 명령어들이 저장되는 코드 세그먼트의 세그먼트 셀렉터를 포함하고 있음

SS : Stack Segment / 주소와 데이터를 일시적으로 저장할 목적으로 쓰이는 스택의 주소를 지정하는데 쓰임

DS : Data Segment / 전역, 정적 변수 데이터가 들어 있는 데이터 세그먼트의 데이터 위치를 가르키는 레지스터

 

ES : Extra(Data) Segment / 추가 레지스터로 주로 문자 데이터의 주소를 지정하는데 사용

FS : Data Segment 

GS : Data Segment

 

ES, FS, GS는 추가적인 데이터 세그먼트다.

 

 

(3) 플래그 레지스터(EFLAGS)

 

 

플래그 레지스터는 각각의 비트마다 의미를 가지고 있다. 1또는 0 / true or false 를 나타낸다.

조건 분기 명령어 에서 Flag의 값을 확인하고 동작 수행 여부를 결정하기 때문에 알아 둬야 한다

 

 

ZF ( Zero Flag ): 비트 6 / 연산 명령 후에 결과 값이 0이 되면 ZF가 1(true)로 세팅됨

OF ( Overflow Flag ): 비트 11

부호 있는 수의 오버플로시 OF를 1(true)로 세팅

MSB( Most Significant Bit )가 변경되었을 때 1(true)로 세팅

CF ( Carry Flag ): 비트 0/ 부호 없는 수의 오버플로시 CF를 1(true)로 세팅

 

 

 

 

 

 

 

2. Stack 구조 및 Stack Frame

 

메모리의 스택(stack) 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역이다.

스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.

 

 

import Foundation

var a: Int = 10;	// 데이터 영역에 할당
var b: Int = 20;	// 데이터 영역에 할당

func dataFunc() -> Bool {

  someFunc1(3)
  someFunc2(5)

  return true
}

func someFunc1(c: Int) {
  int d = 30;	
  // 매개변수 c와 지역변수 d가 스택영역에 할당
}

void someFunc2(e: Int) {
  int f = 40;	
  // 매개변수 e와 지역변수 f가 스택영역에 할당
}

장점

  • 낭비되는 공간이 없다.
  • 하나의 명령만으로 메모리 조작과 어드레스 조작이 가능하다.

단점

  • 한계가 있어 한계를 초과하도록 삽입할 수 없다.
  • 즉, 유연성이 부족하다.

스택은 마지막에 들어온 것이 먼저 나가는 LIFO(Last In First Out) 구조를 가진 자료 구조다. 

 

 

 

스택에서 데이터를 넣는 것을 push , 데이터를 꺼내는 것을 pop

그리고 push pop을 하는 위치를 top이라고 하고, 스택의 가장 아랫부분을 bottom이라고 한다

 

 

 

 

.

 

 

스택 프레임(Stack Frame)이란?

 

함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 저장되는데 이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보. 이러한 스택 프레임 덕분에 함수의 호출이 모두 끝난 뒤에, 해당 함수가 호출되기 이전 상태로 되돌아갈 수 있음.

 

 

스택 프레임의 동작 방식

예제 코드)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Step 1. 프로그램이 실행되면, 가장 먼저 main() 함수가 호출되어 main() 함수의 스택 프레임이 스택에 저장

Step 2. func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등의 스택 프레임이 스택에 저장

Step 3. func2() 함수를 호출하면 해당 함수의 스택 프레임이 추가로 스택에 저장

Step 4. func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수의 스택 프레임만이 스택에서 제거

Step 5. func1() 함수의 호출이 종료되면, func1() 함수의 스택 프레임이 스택에서 제거

Step 6. main() 함수의 모든 작업이 완료되면, main() 함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료

 

이처럼 스택은 가장 나중에 저장된 데이터가 가장 먼저 인출되는 방식으로 동작

이러한 방식을 후입선출(LIFO, Last-In First-Out) 방식이라고 한다.

이때 스택은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다

 

 

 

 

 

출처:

 

https://orang.tistory.com/entry/%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0-Register-%EC%9D%98-%EC%9D%B4%ED%95%B4

 

레지스터 ( Register )의 이해

IA-32(Intel Architecture 32bit)의 레지스터에 대해 정리하겠습니다. ( 리버싱 핵심원리 ) 레지스터란 CPU 내부에 존재하는 다목적 저장 공간입니다. 일반적으로 메모리라고 얘기하는 RAM(Random Access Memory).

orang.tistory.com

http://tcpschool.com/c/c_memory_stackframe

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

m.blog.naver.com/PostView.nhn?blogId=aaasssddd25&logNo=220906791725&proxyReferer=https:%2F%2Fwww.google.com%2F

 

[정리] IA-32 Register

안녕하세요. 칸입니다. 오늘은 저번에 말씀드렸듯이 IA-32 Register에 대해 자세히정리 해보도...

blog.naver.com

medium.com/@jinseok.choi/%EC%8A%A4%ED%83%9D-stack-48a22e52268b

 

[자료구조] 스택(Stack)

스택은 마지막에 들어온 것이 먼저 나가는 LIFO(Last In First Out) 구조를 가진 자료 구조입니다. 일상 생활에서 책을 쌓고, 책을 꺼내는 것과 브라우저에서 서핑 후 뒤로가기 버튼을 누르는 것과 같��

medium.com