2024. 2. 23. 12:15ㆍInformation Security 정보보안/Reverse Engineering 리버스 엔지니어링
배울내용:
PE 파일 구조
정적 분석
PEview
PE File 생성과정
DOS_Header
DOS_Stub
NT_Header
Little Endian
Big Endian
리틀 엔디안
빅엔디안
디버거 도구
PE 파일
Reversing Engineering
리버싱 엔지니어링 기초
지난 학습 내용 :
정적파일 동적파일 , OllyDBG 란? , 디버거 도구, OllyDBG 화면
https://sarimus.tistory.com/84
학습목표
이번시간엔 리버싱 분석방법 2가지인 정적분석과 동적분석중 하나인 정적분석에대해 자세히 알아볼것이다.
그리고 PE 파일 구조를 다룰것이다.
PE 구조는 시작점이 4D 5A 로 시작하면 PE 구조를 가진다고 보면된다 이는 ascii로 나타낼떄는 MZ 로 나오는데 이는 PE 구조의 개발한 사람의 이름을 딴 문자다
위에 나와있는 PE 파일의 생성과정은 아래의 테이블의 순서와같다
먼저 프로그래밍 언어로 코드를 쓴뒤에 컴파일을 하게되면 어셈블리 명령어로 변환되는데
이때 아래의 PE 파일 생성과정의 순서를 따라서 채우게 된다 .
PE 파일 생성과정 순서
1. PE Header먼저 채움
2. .text Section 을채움(printf())
3. .data Section 을 채움 (ascii로 됨 Helloworld)
PE Header에서 Dos Header ,Dos stub , NT Header로 먼저 windows exe 파일인지 확인을하고
아니면 에러가 뜬다.
Dos Header 더 자세히보면 구조체로 되어있는데 이것의 크기계산하면 64byte 이다.
구조체 안에는 Word 로 표현이 되어있는데 이는 2byte(16bit)를 나타낸다
- WORD (워드):
- 워드는 일반적으로 16비트(2바이트) 데이터를 나타낸다.
- 주로 16비트 프로세서 아키텍처에서 사용되며, 주로 메모리나 레지스터에 저장된다.
- 예를 들어, 16비트 정수나 메모리 주소를 나타내는 데에 사용된다.
- Double WORD (더블 워드):
- 더블 워드는 일반적으로 32비트(4바이트) 데이터를 나타낸다.
- 더블 워드는 워드의 두 배인 크기를 갖고 있다
- 32비트 시스템에서 많이 사용되며, 주로 정수, 부동 소수점 숫자, 메모리 주소 등을 표현하는 데에 사용
그런데 이 구조체 중에 가장 중요한 2 가지가 있다
e_magic , e_lfanew 부분 중요
emagic : PE 구조를 가진 파일인지 확인할떄 사용, 프로그램을 실행하면 가장 먼저 이 부분의 2byte를 읽어 온후 PE 구조가 맞는지 확인한다
e_lfanew : 다음에 나올 Image_NT_Header의 시작 주소를 저장 파일에 따라 다른 값이 저장
주소값의 저장에는 Little Endian 표기법이 사용된다
추가적으로 자세히 알고싶은면 검색하거 간단하게 아래의 표에 나타냈다.
Dos Stub
DOS Stub은 보통 매우 작고 단순한 것이 일반적이며, 주로 메시지를 표시하는 데에 사용된다.
Dos Stub 에서는 사실상 분석에서는 중요하지는 안다 그래서 위와같이 처럼 ascii 값에 this program cannot be run in DOS mode 라는 문구를 뛰우고 맨마지막에 PE(Portable Executable , 50 45) 라는게 보인다
맨 끝에 "PE"로 표시되는 이유는 이 파일이 Portable Executable 형식을 따르고 있음을 나타내기 위해서다 . 즉, 이 파일이 Windows 운영 체제에서 실행될 수 있는 표준 형식임을 의미한다.
NT Header
DOS Stub이 PE 파일의 시작 부분에 있고, DOS Stub의 끝은 "PE" 시그니처인 "50 45"로 끝난다면, 파일이 DOS Stub을 포함하고 있음을 알 수 있다. 즉, "PE" 시그니처 앞에 있는 부분이 DOS Stub이다.
NT Header의 50 45 의 24 byte (Signature, FileHeader) 를 제외한 나머지가 Optional Header 인걸 알수있다
( ile Header의 크기는 20바이트이며, Signature는 4바이트 )
DWORD(Double WORD) 가 4 byte 라는걸 보면 Signature 가 4 byte 라는걸 알수있다 .
Image File Header 는 20 byte
그리고 OPtional _header는 그 24 byte 를 뺀 나머지 라는걸 알수있다
구조체를 다 기억할순없지만 위에 있는 구조체는 아는게 좋다
왜냐면 악성코드 분석을 위해 파일을 열자마자 확인 해야할 것들 이기떄문이다.
Little Endian , Big Endian
리틀과 빅 엔디안은 2 자리 씩 끊어서 생각을 한다고 보면된다
예를 들어 머리속(CPU) 에서 상상하게 되는데 이를 레지스터라고 보자
이때 읽는 방법이 2 가지가 있는데
높은 순서대로 읽는 Big Endian (12 -> 34 -> 56 -> 78 )
Big endian: 가장 높은 유효 바이트(MSB)를 가장 낮은 메모리 주소에 저장한다. 즉, 낮은 주소에 높은 자리수의 바이트가 저장한다.
낮은 순서대로 읽는 Little Endian (78 -> 56 -> 34 -> 12)
Little endian: 가장 낮은 유효 바이트(LSB)를 가장 낮은 메모리 주소에 저장한다. 즉, 낮은 주소에 낮은 자리수의 바이트가 저장한다.
왜 이렇게 순서가 낮냐고 하면 0x12345678 로 되어있으면 이걸 2개씩 나눠서 12 , 34 ,56 ,78 이되는데 little endian은 78이 가장 낮은 주소라고 본다
아래의 그림을 보면 좀더 이해하기가 쉽다
Peview
위에처럼 생긴게 Peview 라는 파일이다 이는 PE 파일의 구조를 볼수있다
이걸 실행해서 Notepad.exe (메모장) 을 열어보면
PE 구조를 나타내는걸 볼수있다
이중 Image _NT _HEADERS 를 열어보면 아까 공부했던
Signature ,Image_file_Header , Optional _Header 가 나오는걸 볼수있다
Signature 에서는 little endian 방식으로 되어있어서 00 00 45 50 으로 되어있는걸 볼수있다
(뒤에서부터 50 45 00 00 을 읽기 떄문)
File_Header 에서도 아까 공부했던 것들을 볼수있다
여기에선 언제 만들어졌는지 (컴파일해서 윈도우즈에서 만들어졌는지)
그리고 Optional Header 에는 이렇게 되어있다
이제 위에서 배웠던 것들이 눈에 보일것이다
만약 기억이 가물가물하면 다시 위에가서 보고오도록 하자