Sh4n3e
Reversing[1] 본문
우리가 사용하는 많은 프로그램들은 어떻게 실행이 되는 걸까요?
앞으로 Reverse Engineering(역공학, 리버스 엔지니어링)을 공부하면서, 이런 프로그램들이 어떻게 만들어지는 것이고, 어떻게 작동되는 것인지에 대해서 알아볼 계획입니다.
첫째로, 우리가 Windows 환경에서 사용하는 대부분의 프로그램들은 32bit기준으로 작성된 프로그램들입니다. 보통 말하는 x86과 x64는 인텔이 개발한 마이크로프로세서 계열을 부르는 말이자, 이들과 호환되는 프로세서들에서 사용한 명령어 집합 구조들을 통칭하는 말입니다. 여기서 x86은 32bit의 체제를 말하며, x64는 64bit의 체제를 말합니다.
우리는 역공학을 하기 앞서 이 프로세서들이 갖고있는 레지스터들의 특징을 알아 합니다. 범용레지스터로는 총 8개가 존재합니다. 여기서 4개의 일반 레지스터와 4개의 주소 레지스터가 존재합니다. 4개의 일반 레지스터는 주소 레지스터보다는 더 일반적인 용도로 사용되며, 특정 명령에서는 특정한 레지스터만 쓸 수 있는 경우가 있습니다.
- EAX : 누산기에 해당하며 대부분의 연산들이 수행된다.
- ECX : 개수, 횟수 등을 저장하는 카운터로 주로 사용된다.
- EDX : 누산기의 화장으로 누산기와 관련된 연산에서 사용된다. EDX와 EAX를 합쳐 64bit 연산을 하는 경우가
대표적이다.
- EBX : 일반적인 데이터 레지스터로, 원래 16bit 모드에서는 포인터로 사용했다.
해당 4개의 레지스터는 32bit 즉, 4byte의 크기를 가지고 있으며, 16bit 와 8bit단위의 사용이 가능합니다.
EAX를 예로 들었을때, 16비트로 사용될 때는 AX라고 불리며 8bit로 사용될 때 AH와 AL로 사용됩니다.
나머지 4개의 레지스터는 아래와 같이 존재합니다.
- ESP : 스택의 꼭대기 주소를 담는다.
- EBP : 현재 스택 프레임의 주소를 담으며, 일반적인 목적으로 쓰기도 한다.
- ESI : 문자열 연산에서 사용되는 목적 주소를 담는다.
- EDI : 문자열 연산에서 사용되는 목적 주소를 담는다.
또한 이런 범용레지스터와는 별게로 추가적으로 EIP라는 레지스터가 존재합니다.
- EIP : 현재 실행되는 명령의 주소를 담는다.
자세한 레지스터에 대한 활용은 추후에 사용해보면서 익히도록 하겠습니다.
둘째, 저장된 프로그램의 개념을 알아야할 필요가 있습니다. 또한 무엇이 프로그램을 실행시키는지에 개념이 필요할 것입니다.
다음 그림은 Fetch cycle과 Execution cycle의 모습을 보여주고 있습니다.
해당 그림에서 볼 수 있듯이 프로그램은 Fetch -> Decode -> Fech Operands -> Execute -> Store Output의 순서로 진행이 된다는 것을 개념상 보실 수 있을 것입니다.
그렇다면 과연 우리가 작성한 프로그램은 어떻게 구동하는 것일 까요? 작성한 소스코드는 프로그램 언어의 특성에 따라 컴파일 방식과 인터프리터 방식이 존재합니다.
컴파일 방식의 경우, 우리가 작성한 코드는 컴파일러에의해 컴파일 과정을 거치면서 Stripped Binary로 바뀌게 됩니다. 이렇게 바뀐 Binary에는 2가지 종류가 존재합니다.
1) Static Linked Binary로 이것은 외부에 함수를 전혀 호출하지 않는다는 것입니다.
2) Dynamic Linked Binary는 평소 우리가 사용하는 형태로 lib나 dll과 같은 형태로 보시면 되겠습니다. 특히 이런 경우에는 Symbol이 완전히 제거되지 않았기에 분석에 용이한 점을 가지고 있습니다.
인터프리터 방식의 경우, 우리가 작성한 코드를 한줄씩 읽어 결과를 즉시 출력하게 됩니다. 이렇게 인터프리터 방식으로 사용된 언어는 대표적으로 JAVA가 존재하며, 이런 언어는 Decmoplie이 가능하며, 컴파일러에 의해 분석된 것보다 비교적으로 분석이 쉽습니다.
우선적으로 간단하게 레지스터와 프로그램의 구동방식을 알아보았습니다. 다음 시간에는 Windows상에서 실행되는 프로그램의 구조 즉, 컴파일된 프로그램의 구조가 어떠한 형식을 띄고 있는지 알아보도록 하겠습니다. 감사합니다.
'System Hacking > Reverse Engineering' 카테고리의 다른 글
Debugger 단축키 (0) | 2017.06.16 |
---|---|
DLL 작성 및 로딩 방법 (0) | 2015.12.24 |
Reversing[4] - PE(2) (0) | 2015.10.08 |
Reversing[3] - PE(1) (0) | 2015.10.07 |
Reversing[2] (0) | 2015.10.06 |