Try Attack/Reverse Engineering[basic]

PE파일 섹션 추가 및 삭제하기

D4tai1 2020. 3. 24.

종종 무언가를 하다보면

 

"나름대로 열심히했는데..."

 

되지 않을 때가 있죠?

 

 

"나름대로"라는 말이 빠지고 

 

"1분 1초도 아껴가며"라는 말이 들어가면 

 

"1분 1초도 아껴가며 열심히 했는데..."가 되고

 

그러면 왠지 뭐든 될 것 같지 않나요?

 

하하

 


이와같이

PE파일에서도 필요없는 섹션은 제거하고

 

필요에 따라 섹션을 몇 개든 추가할 수 있답니다.

 

물론 한 바이트, 한 바이트

 

바이트수공업을 해야한다고 하면 

 

포기하실수도 있으니 

 

쉿,,,

 

 

전에 다룬 내용에서 .reloc섹션을 다루었으니

 

.reloc섹션을 지워보려고 합니다.

 

exe파일은 제거해도 정상적으로 동작하지만

 

dll과 sys파일은 기본적으로 적재되는 위치가 정해져있기 때문에

 

실행되지 않을 가능성이 무지무지 높죠!

 

우선 .reloc섹션을 제거하기 위한 방법

1) .reloc 섹션헤더를 정리합니다.

 ▶ 크기만큼 정리 전 Virtual Size(실제 존재하는 데이터의 크기),

Size of Raw Data(.reloc섹션의 크기),

Pointer to Raw Data(.reloc섹션의 위치)는 확인해야 함!

 

2) .reloc 섹션을 제거합니다.

 ▶ 1)에서 얻은 정보를 이용해 제거

 

3) IMAGE_FILE_HEADER를 수정합니다.

 ▶ Number of Section의 개수를 변경

 

4) IMAGE_OPTIONAL_HEADER를 수정합니다.

 ▶ Size of Image를 수정

 

제가 만든 test.exe 파일을 만져볼게요.

 

여러분도 직접 만든 파일을 반죽해보세요.

 

우선 .reloc섹션을 제거해보도록 하겠습니다.

 


 

[그림1] .reloc섹션의 시작주소와 크기 확인

노란박스인 Pointer to Raw Data가 0x34600으로 .reloc섹션의 시작위치구요.

 

핑크박스인 Size of Raw Data가 0x200으로 .reloc섹션의 크기를 의미합니다.

 

그 위에 Virtual Size는 실제 데이터가 존재하는 영역의 크기 0x164를 의미합니다.

 

즉, 0x34600~0x347FF까지가 .reloc섹션의 범위라고 할 수 있겠네요.

 

[그림2] .reloc섹션헤더 제거

 [Ctrl+G]를 눌러서 298을 입력해서 이동하구요.

 

섹션헤더의 크기는 0x28(40)바이트인거 아시죠?

 

0x298+0x28 - 1(0부터시작) = 0x2BF

 

0x298~0x2BF까지 선택합니다.

 

[그림3] 선택영역 우클릭 - 선택 채우기

 선택이 됐다면 [우클릭] - [선택 채우기]를 클릭 후

 

NULL(00)으로 패팅해줍니다.

 

여기까지 .reloc섹션헤더는 정리가 되었습니다.

 


 

[그림4] .reloc섹션 확인

이제 [그림1]에서 확인한 .reloc섹션헤더의

 

위치 = 0x34600, 크기 = 0x200 

 

0x34600~0x347FF 영역을

 

전부 0으로 초기화시킬게요.

 

[그림5] hxd로 확인한 .reloc섹션

 [Ctrl+G]를 눌러서 34600을 입력해서 이동하구요.

 

[Ctrl+E]를 눌러서 원하는 블록을 선택할 수 있습니다.

 

선택이 됐다면 delete를 눌러서 삭제하시면 됩니다.

 


 

이제 IMAGE_NT_HEADER - IMAGE_FILE_HEADER의

 

2번째 필드인 섹션개수를 변경하겠습니다.

 

[그림6] IMAGE_FILE_HEADER

섹션 한 개를 삭제했기 때문에

 

Number of Sections의 값을 4로 변경해야겠죠?

 

[그림7] 변경된 섹션헤더의 개수

변경되어 현재 4개의 섹션만 존재하는 상태입니다.

 


 

 마지막으로 전체 이미지 크기를 변경해주면

 

정상적으로 동작하겠죠?

 

기대를 가득 안고 전체 이미지 크기를 확인해볼까요?

 

IMAGE_NT_HEADER - IMAGE_OPTIONAL_HEADER에서

 

Size of Image를 확인해보겠습니다.

 

[그림8] IMAGE_OPTIONAL_HEADER

Size of Image를 보니 0x38000크기를 가졌군요?

 

Section Alignment는 0x1000이라네요.

 

Section Alignment은 섹션의 기본단위를 의미합니다.

 

즉, 데이터가 0xFF0만큼 있다면 섹션의 크기는 0x1000이겠지만 

 

데이터가 0x1010만큼 있다면 섹션의 크기는 0x2000이 됩니다.

 

어쨌든 [그림1]에서 확인한 .reloc섹션의 실제크기(Virtual Size)는

 

0x164이므로 원래 .reloc섹션은 기존에 0x1000만큼 존재했을거로 보이네요.

 

그래서

 

0x38000 - 0x1000 = 0x37000

 

Size of Image를 0x37000으로 변경해줍니다.

 

 

이제 소름돋게도 정상적으로 실행되는 파일을 확인할 수 있습니다.

 

여러분은 섹션을 제거하는 방법을 익히셨습니다.

 

하하

 

 

섹션을 제거해 보았으니

 

이제 섹션을 추가해볼까요?

 

저는 열공하는 베짱이 D4tai1이니

 

.D4tai1 섹션을 추가해보겠습니다.

 

 

섹션을 추가하는 방법은 

 

마지막에 있는 .reloc섹션헤더를 하나 복사합니다.

 

섹션의 이름은 .D4tai1로 하였습니다.

 

이후 Number of Section을 한 개 증가시킵니다.

 

.D4tai1섹션의 RVA를 기존헤더에서 0x1000만큼 증가시켰습니다.

 

Pointer to Raw Data는 .reloc섹션 끝부분의 다음주소로 설정하였습니다.

 

Size of Raw Data는 0x200으로 설정 후 

 

.D4tai1섹션을 00(NULL)로 0x200만큼 패딩하였습니다.

 

그리고 Size of Image를 0x1000만큼 올리면

 

[그림9] .D4tai1 섹션 추가

섹션을 추가하였지만 프로그램은 

 

정상적으로 동작하는 것을 확인할 수 있습니다.

 

 

댓글