티스토리 뷰

Application/Debug

[해킹] PE 형태의 파일에 섹션 추가하기

알 수 없는 사용자 2006. 6. 30. 10:37
PE 형태의 파일에 섹션 추가하기이번글에서는 PE파일에 섹션을 추가하는 방법에 대해서

다룰것이다. 섹션을 추가하는 이유는 프로그램에 빈공간이

없을경우 빈공간을 만들기 위해서이며 이미 섹션을 쉽게

추가 시켜줄수 있는 프로그램들이 존재한다.
이런 프로그램들 역시 이번글에서 다루는것과 같은 방법을
프로그램화 시켜 놨음뿐임으로 그런류의 프로그램을 직접
만들어 보는것도 괞찮다고 생각한다.


우선 PE 스캐너를 이용하여 대상 파일을 한번 살피어 보자.

본인은 Stud_PE를 사용하겠다. 열어서 섹션을 보면 밑처럼 되어 있다.



text,rdata,data,rsrc 이렇게 4가지 섹션들로 프로그램이 이루어

졌음을 알수 있다. 이제 대상을 헥스 에디터를 열어

PE Header를 수정하여 보자. 가장 먼저 파일의 크기를 증가

시키어 보자. PE스캐너로 Header를 보면 대상의 Size of Image 가

0x4508 임을 볼수 있다. 현재 이미지의 크기가 0x4508 이라는

뜻이다. 또한 Sections Alignment 의 값은 0x1000 임을 알수 있다

이말은 섹션의 크기가 작아도 0x1000 은 되어야 한다는 말이다.

그럼으로 0x4508 에 0x1000 을 추가시켜 0x5508로

증가 시키어 줄것이다.




대상의PE해더 시그니처는 0x0C에 위치하며,

이미지의 크기는 시그니처 부터 0x50 에 있음으로 오프셋 0x5C 에 있다.

45 -> 55 로 바꾸어 주면 된다. 그런 다음 두번째로

Number of Sections 값을 증가 시키어 보자.


섹션의 갯수는 시그니처로부터 0x06에위치에 있음으로 오프셋 0x12 에 있다. 0x12부분을

보면 04 00 으로 되어 있는데 이를 05 00 으로 고쳐 주도록 하자.

이제 해야할 일은 섹션 테이블에 우리가 추가 시키고자 하는 섹

션의 정보를 입력 하여 주는것이다. 섹션 테이블의 시작지점은

PE시그니처 에서 부터 0xF8 거리임으로 0x0C + 0xF8 즉,

0x104 에서 시작함을 알수 있다. 섹션은 한개당 길이가 0x28 이

다. 이전에 섹션이 4 개 있었음으로 0x28 * 0x4 =A0 임으로

시작 오프셋인 0x104에 + 0xA0 = 0x1A4 부터 우리의 섹션의

정보를 추가 시켜주면 된다. 섹션의 정보의 구조체는 밑과 같다.

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::



Name 8Bytes :섹션의 이름

Virtual Size 4Bytes :섹션의 크기

Virtual Offset 4Bytes :수정전Size of Image값

Raw Size 4Bytes :섹션의 크기

Raw Offset 4Bytes :섹션의 시작지점

PointerToRelocations 4Bytes

PointerToLineNumbers 4Bytes

NumberOfRelocations 2Bytes

NumberOfLineNumbers 2Bytes

Characteristics 4Bytes :섹션의 타입

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::



먼저 Name 은 .dual 이라고 하여 보도록 한다.



위그림 에선 Name 이 5Bytes 를 차지하고 나머지는 00 00 00


으로 3Bytes 를 매꾸어 준다.




그다음은 Virtual Size를 얼마로 할건지에 대한것인데,

Virtual Size의 값을 Sections Alignment 값인 0x1000 으로 채워 준다.



그다음은 Virtual Offset 인데 이전 섹션의 Virtual Offset + Alignment 값을


어주면 된다. 그럼으로 이전 섹션의 VO가 0x4000임으로 0x5000을 적어주면 된다.


Raw Size 은 File Alignment 값과 같은 0x200 으로 채워 주면 된다








Raw Offset 의값을 적기 위해선 파일의 끝이 어디인지를 우선


알아야 한다. 보는 바와 같이 파일의 끝이 0x1104임을 알수 있다


파일의 끝부분을 섹션으로 사용할것임으로 0x1104로 채워준다.



위의 0x0C 만큼의 값은 그냥 빈칸으로 두면된다.



본인은 Characteristics 값을 E0000060 으로 채워 주었는데


이값은 CODE +INITIALIZED_DATA + MEM_EXECUTE + MEM_READ +


MEM_WRITE 의값이다.


섹션의 크기를(Raw Size에서) 0x200 으로 했고 섹션의 시작지점을


0x1104 으로 지정했음으로 0x1104 부터 0x200 만큼의 공간을


00 으로 0x1304 까지 채워주면 된다.


이제 모든 작업이 끝났음으로


적용 되었는지 파일 스캐너를 통하여 본다.



위의 그림과 같이 성공적으로 추가 되었음을 볼수 있다.



출처: http://dualpage.muz.ro/

'Application > Debug' 카테고리의 다른 글

[해킹] RAW 와 RVA 간의 계산  (0) 2006.06.30
[해킹] Import Table  (0) 2006.06.30
[해킹] 올리 디버거에서 API에 브포 걸기  (0) 2006.06.30
[해킹] What a W.P.E?  (0) 2006.06.30
[해킹] Inside Of Tsearch  (0) 2006.06.30