[조립하면서 배우는 PE] 두번째 이야기 : DOS header 와 DOS stub Code Reverse Engineering
리버싱 2017. 1. 10. 16:28두번째 이야기입니다. 오늘은 그림을 종이에 못그렸습니다. 주변에 휴지는 많은데 종이는 없네요. ㅠ.ㅠ; 제 소중한 노트도 잃어버리고. 대신에 화이트 보드에 쓱쓱그려 올려봅니다.(한밤중에 찍은 사진이라 불빛은 도저히 어떻게 할 수가 없습니다) 이번에는 정말로 정말로 별거 없습니다. 그저 [그림 1]만 쓱쓰~윽 그려 낼 수 있으면 그걸로 땡입니다. 게다가 첫번째 이야기 때 이미 어느 정도 언급되었던 내용이라 크게 어려운 점은 없을 것입니다. 그래도 연재 후반부에 실제 PE 파일을 맹글때 필요한 내용들이므로 천천히 읽어보시기 바랍니다. 그럼 시작하죠.
[그림 1] DOS 헤더와 DOS 스텁 코드
DOS 헤더
이미 첫번째 이야기에서 알아본 사실이지만 복습도 할겸 한 번더 설명드립니다. [그림 1]이 다 이해되시는 분들은 스킵하세요. DOS 헤더는 DOS와의 호환을 위해 유지되고 있는 헤더라고 보시면 됩니다. 실제로는 별 쓸모가 없습니다만, 어쨌든 PE 파일은 DOS 헤더로 시작합니다. DOS 헤더는 항상 64bytes 사이즈를 가지며 윈도우 내에서 IMAGE_DOS_HEADER 라는 구조체로 정의되어 있습니다. IMAGE_DOS_HEADER에 대한 정의는 머리만 아프게 하므로 생략하겠습니다만, 나중에라도 대충 살펴보면 DOS 헤더는 다 외울 수 없는 그리고 외울 필요도 없는 약 20개 가량의 멤버로 구성되어 있다는 사실을 알 수 있을 것입니다. 다행스럽게도 DOS 헤더의 멤버 중에서 기억해야 할 녀석들은 DOS 헤더의 처음 2bytes를 차지하는 e_magic과 마지막 4bytes를 차지하는 e_lfanew 뿐입니다. 나머지는 거의 필요없는 부분으로 나중에 PE 파일을 수작업으로 생성할 때 보겠지만 전부 0으로 채워도 아무 문제가 되지 않습니다. DOS 헤더의 처음 2bytes를 차지하는 e_magic은 DOS 헤더의 signature로 [그림 1]에 보이는 것과 같이 항상 '4D 5A(MZ)' 값을 가집니다. DOS 헤더의 마지막 4bytes를 차지하는 e_lfanew는 PE 헤더의 시작점을 가르키는 오프셋 값입니다. 더불어 알아두어야 할 사실은 DOS 헤더의 시작 위치 즉 PE 파일의 시작 위치에 관한 것입니다. 디스크 상에서의 시작 위치야 당연히 파일의 시작점이 될테구요 메모리 상에서는 PE 헤더(그림 1에서 IMAGE_NT_HEADER)에 기록되어 있는 ImageBase가 시작 위치가 된다는 사실 다시 한번 기억해 두시기 바랍니다.
DOS 스텁 코드
별로 관심을 가지지 않아도 될 만한 부분입니다. 실제로 DOS 스텁 코드는 필수 구성 요소는 아니어서 DOS 스텁 코드가 없더라도 프로그램이 실행되는 데는 아무런 지장이 없습니다.그래도 알아두어야 할 내용이 있다면 DOS 스텁 코드는 프로그램을 도스 모드에서 실행시켰을 때 실행 되는 코드이며 보통은 "This program must be run under Microsoft Windows"라는 메시지를 출력하고 종료되는 코드가 삽입된다는 점과 오브젝트 파일을 링킹할 때 STUB 옵션을 이용하여 원하는 스텁 코드를 삽입할 수 있다는 점 정도만 알아두면 되겠습니다. 물론 그림을 보면 알겠지만 스텁 코드는 DOS 헤더 바로 다음에 위치한다는 점도 알아두시고요 더불어 사이즈는 고정되어 있지 않다는 점도 알아두세요.
PE를 조립하자 1 : DOS Header 만들기
이제 PE의 전체 구조와 DOS Header에 대해서 알았으니 PE 파일 제작의 첫번째 단계로 DOS Header를 만들어 보도록 하겠습니다.
준비물 : Hex 에디터(본 글에서는 WinHex를 사용했습니다.)
제작과정
Step 1 : [그림 2]와 같이 WinHex를 실행시켜 64bytes 사이즈를 가지는 새로운 파일을 생성합니다.
[그림 2] 64bytes 사이즈의 새로운 파일을 생성
Step 2: [그림 3]과 같이 처음 2bytes 부분의 값을 "4D 5A"로 수정합니다. DOS 헤더의 시그너춰인건 아시죠?
[그림 3] DOS 시그너춰(e_magic) 입력 (클릭 후 확대해서 보세요)
Step 3: [그림 4]에서 처럼 마지막 4bytes (e_lfanew)의 값을 0x40(64)로 설정합니다. 우리는 DOS stub 코드를 사용하지 않을 것입니다.!!! 우리가 만들 PE 파일은 DOS 헤더 다음에 바로 PE 헤더가 오는 것이죠. 리틀엔디언임을 고려하여 40 00 00 00 으로 입력해야 합니다.
[그림 4] PE 헤더의 시작 지점을 지정
Step 4: DOS Header가 완성되었습니다. 매우 쉽네요. 이 파일은 계속 사용해야 하므로 MyFirstPE.bin이라는 이름으로 저장하겠습니다.
맺음말
거의 첫번째 이야기의 복습판이군요. 정말로 별다른 내용이 없습니다. ^^; 세번째 이야기에서는 PE 헤더에 대해서 알아보도록 하겠습니다.
출처 - http://zesrever.tistory.com/56
'리버싱' 카테고리의 다른 글
[조립하면서 배우는 PE] 네번째 이야기 : PE Header(2) Reverse Engineering (0) | 2017.01.10 |
---|---|
[조립하면서 배우는 PE] 세번째 이야기 : PE Header(1) Reverse Engineering (0) | 2017.01.10 |
[조립하면서 배우는 PE] 첫번째 이야기 : PE의 전체적인 구조 Reverse Engineering (1) | 2017.01.10 |
PE(Portable Executable) 구조 (0) | 2017.01.10 |
[개념 이해] PE 파일의 구성 (0) | 2017.01.10 |