이 글의 모든 내용은 책 '악성코드 분석 시작하기'를 스스로 공부하며 정리한 내용임을 밝힙니다.
컴퓨터 프로그램 기초
1. 데이터 단위
● 바이트(Byte): 1byte = 8bit → 16 진수 2개(00~FF)
● 워드(Word): 2byte
● 더블워드(Dword): 4byte
● 쿼드워드(Qword): 8byte
※ 워드(Word)는 본래 동작하는 CPU의 최소 연산 단위를 의미한다. 예를 들면, 32bit OS에서의 워드는 32bit, 64bit OS에서의 워드는 64bit가 되어야 한다. 그런데 왜 워드의 단위는 2byte일까? 과거 Intel에서 16bit 운영체제에서 사용하던 워드의 단위는 당연히 16bit였을 것이다. 그런데 기술이 발전하면서 32bit 운영체제의 컴퓨터가 필요에 의해 등장하였고, 기존에 16bit였던 워드를 32bit로 개념을 확장한다면 16bit 프로그램이 제대로 작동하지 않거나 사용자들의 혼란을 야기할까봐 그 크기를 16bit로 하기로 약속하였다. 그 이후 더블워드, 쿼드워드란 개념을 사용하여 32bit(4byte), 64bit(8byte)를 표현하였다.
2. 프로그램의 탄생 과정
이건 대학교에서 항상 프로그래밍 언어를 배우게 되면 초반에 등장하는 개념이다...
프로그램은 다음 과정을 거쳐서 탄생한다.
1) 개발자는 C나 Java와 같은 프로그래밍 언어로 소스 파일을 작성한다.
2) 컴파일러를 통해 소스 코드 파일은 컴파일되어 오브젝트 파일이 생성된다. 이때 오브젝트 파일 내용은 컴퓨터가 이해할 수 있는 기계어로 가득차있다. (01 00 E0 F2 ... 와 같은...)
3) 링커를 통해 오브젝트 파일은 링크(Link) 과정을 거쳐 필요한 라이브러리(DLL)와 연결되어 시스템에서 실행할 수 있는 실행 파일(.exe와 같은)로 완성된다.
보통 위 과정을 통틀어서 일반적으로 빌드(Build)라고 한다.
3. 디스크에서의 프로그램
디스크에서 실행 파일은 크게 PE 헤더, 코드, 데이터 3가지로 나뉘어진다. 코드는 보통 .text 섹션에 포함되어 CPU 프로세서가 실행할 기계어들이 저장되어 있는 공간이다. 데이터의 경우 .data, .rdata, .rsrc 등과 같이 CPU가 프로그램을 실행할 때 필요한 데이터들이 저장되어 있는 곳이다. 디스크 상에서 실행 파일은 다음과 같은 구조를 가진다.
4. 메모리에서의 프로그램
메모리에서의 프로그램 구조는 디스크에서의 구조보다 조금 복잡하다. 프로그램이 메모리에 적재(load)되었다는 것은 지금 그 프로그램이 동작하고 있고 CPU와 계속적으로 상호작용하고 있다는 의미이다. 프로그램은 동작하면서 자신이 필요한 데이터를 메모리로부터 읽기도 하고 값을 수정하기 위해 쓰기도 한다.
기본적인 구조는 디스크에서의 구조와 비슷하지만 위에서 언급한 것처럼 계속하여 데이터와 상호작용 하기위한 공간 스택(Stack)과 힙(Heap)이 등장한다.
스택은 보통 지역변수, 함수 인수, 함수 반환 주소 등을 저장하는 데 사용된다.
힙은 프로그램이 동작하면서 동적으로 생성한 메모리 공간과 데이터를 할당하기 위해 사용된다.
스택과 힙은 개발자는 물론 리버싱을 하는 데 있어 중요한 데이터 구조이므로 반드시 알아둬야 한다...
자세한 내용은 추후 포스팅 예정
결론적으로 프로그램은 다음 과정으로 실행/수행된다.
1) 프로그램(코드와 데이터)을 메모리에 적재한다.
2) CPU는 명령어를 가져온 후 디코딩하고 실행한다.
3) CPU는 메모리에서 필요한 데이터를 가져온다.
4) CPU는 필요한 경우 입/출력 장치(키보드, 마우스 등)와 상호작용을 할 수 있다.
한 동안 어셈블리어도 독학하고, 치트 엔진(Cheat Engine)에 빠져서 포스팅을 안 하고 있었다...
게임을 실행하고 게임 데이터 이것저것을 수정해보는데(당연히 싱글 게임이다...) 너무 흥미롭고 재밌다.
기회가 된다면 치트 엔진 관련 글도 포스팅할 예정이다.
다음 포스팅은 CPU와 레지스터에 대해 공부하고, 실제 어셈블리어를 해석하고 분석하는 글을 다룰 것이다.
'리버싱(Reversing) > '악성코드 분석 시작하기' 정복' 카테고리의 다른 글
[악성코드 분석]#4 어셈블리어와 디스어셈블리 - part(3/3) (2) | 2023.08.10 |
---|---|
[악성코드 분석]#4 어셈블리어와 디스어셈블리 - part(2/3) (0) | 2023.07.11 |
[악성코드 분석]#3 동적 분석 - part(2/2) (0) | 2023.06.21 |
[악성코드 분석]#3 동적 분석 - part(1/2) (1) | 2023.06.20 |
[악성코드 분석]#2 정적 분석 - part(2/2) (0) | 2023.06.15 |