[조립하면서 배우는 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

: