상세 컨텐츠

본문 제목

0x01 - Reversing 의 서막...Part 1(레지스터, 메모리)

Reversing

by 조땡땡이 2020. 6. 15. 01:35

본문

# 자... 리버싱이란 무엇일까요...?

리버싱(Reversing)이란 Reverse와 Engineering의 합성어로 역공학이라는 뜻이다. 이것은 완성되어 있는 시스템을 역으로 추적하여 설계기법, 정보들을 분석하여 자료를 얻어내는 행위임! 이를 보안에 적용하면 시스템 구조를 파악하는 데 용이하여 취약점을 발견할 수 있고, 이를 통해 보안 혹은 해킹에 이용될 수 있다.

 

 

간단하게 이런 느낌이라고 보면 됩니다..... ㅎ

컴파일을 통해 프로그램 제작

[소스코드 작성 -> 어셈블리어로 변환 -> 바이너리 파일 생성]

리버싱

[바이너리 파일 생성 -> 어셈블리어로 변환 -> 소스코드 작성]

 

 

1. CPU 레지스터를 알아보자

우선 CPU(Central Processing Unit)는 메모리로부터 명령어를 가져와서(fetch) 어떤 명령어인지 해석하고(decode) 실행하는(execute) 동작을 한다. 레지스터는 리버싱을 하기 위해서는 기본적으로 알아야 하는 지식이므로 꼭 알아야함!!!

 

1.1 범용 레지스터

- 범용 레지스터가 하는 몇가지의 역할이 있다. 작은 데이터의 임시저장 공간 역할, 연산처리 및 번지지정을 도와주며 컴퓨터의 장치들을 제어함

종류 용도
EAX 산술(덧셈, 곱셈, 나눗셈 등) 논리연산을 수행하여 함수의 반환값이 저장
EDX 큰 수의 곱셈과 나눗셈 연상에서 EAX 레지스터와 함께 사용이 되고 부호 확장 명령 등에 사용
ESI 데이터를 조작하거나 복사 시 소스데이터의 주소가 저장
EDI 복사 시 목적지의 주소가 저장
EBX ESI 레지스터나 EDI 레지스터와 결합될 수 있으며 메모리 주소를 저장
ECX 반복 명령어 사용 시 반복 카운터로 사용되는 값을 저장
ESP 스템 프레임에서 스택의 가장 끝 지점 주소가 저장되며 Push, Pop 명령에 따라 값이 4바이트씩 이동
EBP 스텍프레임에서 스택의 시작 지점 주소가 저장,되며, 스텍프레임이 소멸되지 않는 이상 EBP 레지스터의 값은 변하지 않음

[표 1] 범용 레지스터 종류

 

1.2 세그먼트 레지스터

- 세그먼트 레지스터는 세그먼트라고 하는 메모리 영역에 대한 주소지정을 제공함

종류 용도
CS 코드 세그먼트(명령코드가 작성되는 부분)의 시작주소를 포함. 이 세그먼트 주소에 명령어 포인터(IP) 레지스터의 오프셋 값을 더하면 실행하기 위한 메모리로부터 가져와야할 명령어 주소가 됨
SS 메모리 상에 스택의 구현을 가능하게 함. 스택 세그먼트(스택에서 데이터를 처리하는 부분)의 시작주소를 포함
DS 프로그램에서 정의된 데이터, 상수, 작업 영역을 포함. 데이터 세그먼트의 주소를 포함한다.
ES 데이터 수신측의 시작부분을 포함. 또한 스트링 명령에 보조적으로 사용됨
FS, GS ES와 비슷한 역할로 여분의 세그먼트 레지스터

[표 2] 세그먼트 레지스터 종류

 

1.3 플래그 레지스터

- 플래그 레지스터는 32비트의 크기를 가진다. 32비트 마다 의미를 갖고 있으며, 32비트 중 ZF, OF, CF는 조건 분기 명령어에서 동작 수행여부를 결정함

종류 용도
ZF(Zero Flag) 산술 및 논리 연산의 결과가 0이 되면 ZF는 1(True)가 됨
OF(Overflow Flag) 부호 있는 연산 결과가 용량보다 크면 OF는 1(True)가 됨
CF(Carry Flag) 부호 있는 연산 결과가 용량보다 크면 CF는 1(True)가 됨

[표 3] 플래그 레지스터 종류

 

1.4 주소 레지스터

- 주소 레지스터는 CPU가 처리할 명령이 들어 있는 메모리 주소를 나타내는 레지스터임

종류 용도
EIP 다음 실행할 명령이 들어있는 메모리의 주소를 가르킴

[표 4] 주소 레지스터 종류

 

2. 메모리 구조

- 메모리 구조를 살펴보자...

메모리 세그먼트 설명
Stack 크기가 변하며, 지역 변수가 저장된다. 0xffff의 끝부분 부터 순서대로 지역 변수를 할당함
Heap 스택과 마찬가지로 크기가 가변하며, 동적으로 할당된 데이터가 저장됨
BSS 초기화 되지 않은 데이터가 저장됨
DATA 전역변수(global), 정적변수(static), 배역(array), 구조체(structure)등이 저장됨
TEXT 프로그램의 소스코드가 저장됨

[표 5] 메모리 구조

 

[그림 1] 메모리 구조

 

 

3. 스택 프레임

* 스택만 추가로 알아보는건 불공평하지만... 그래도 리버싱하면서 중요하므로 스택 프레임이란 것을 알아보자...

 

- 스택 프레임이란 함수가 호출 되었을 때 함수가 가지는 공간 구조이다. 함수가 동작을 종료하고 복귀할 때 스택 프레임은 소멸된다. ESP 레지스터는 스택 포인터 역할을 하며 EBP 레지스터는 베이스 포인터 역할을 한다. ESP 레지스터의 값은 프로그램 안에서 수시로 변경이 되기 때문에 스택에 저장된 변수나 파라미터에 접근할 때 ESP 값을 기준으로 잡으면 프로그램을 만들기 어려워진다. 그래서 생겨난게 스택 프레임!!!!

따라서 ESP 값을 EBP에 저장하여 유지해주면 ESP 값이 아무리 바뀌어도 EBP를 기준으로 해당 함수의 변수, 파리미터, 복귀주소에 접근이 가능하다...

 

[그림 2] 스택 프레임 구조

 

 

 

 

글 한개에 너무 많은 내용이 적혀 있으면 가뜩이나 지루한데 더 지루해지기 때문에 오늘은 여기까지...(핑계가 아닙니다!)

 

추가로 내일 바로 ㅎㅎ 이번주 어셈블리어에 대한 정리를 끝내고 다음주부터 레나 스타트 끊어 봅시다!!

 

신난다.. 재미난다...

 

 

 

 

더 게임 오버데스??? ㅎㅎ 핵노잼...

관련글 더보기