2023. 7. 5. 16:36ㆍ리버스 엔지니어링/2부) PE File Format
이번 글은 14장 "실행압축" 입니다.
이번장에서는 지난 13장 "PE File Format"에서 학습한 내용이 나옵니다.
https://baebenzene.tistory.com/5
[rev] 리버싱 핵심원리 2부) PE File Format 13장
이번 글은 2부 PE File Format 입니다. 1부에서 파일들을 IDA로 디버깅하여 공부를 해봤는데요, 그럼 이런 생각이 들 수도 있습니다. " 모든 파일을 IDA로 실행 가능할까? " 하지만 이것은 불가능합니다.
baebenzene.tistory.com
데이터 압축
이번 장에서는 압축에 대해 배웁니다. 일반적으로 압축이라 한다면 ZIP확장자를 생각하는데요.
사실 압축은 두 가지 압축이 존재합니다.
- 비손실 압축
파일의 크기를 줄일 때 사용하는 방식으로, 보관 및 이동을 용이하게 합니다.
예시로 ZIP과 같이 파일을 압축하는 경우가 비손실 압축에 해당합니다.
- 손실 압축
미디어 파일(jpg, mp3, mp4)에 대해 의도적인 데이터 손실을 주어 압축하는 목적으로 사용합니다.
사람이 인식할 수 없는 수준의 영역을 제거함으로써 데이터의 크기는 줄이고 사용자가 구분할 수는 없습니다.
- 실행 압축
PE파일을 대상으로 파일 내부에 압축해제 코드를 가지고 있어 실행 시 압축을 해제 후 실행하는 방식입니다.
일반적인 PE파일 동작 방식과는 다르게 Decoding - EP 과정을 통해 실행됩니다.
패커
PE파일을 압축할 때 사용하는 도구를 말한다.
실행 압축을 하는 이유는 다양하지만 일반적인 압축과 같이 파일의 크기를 줄이는 이유만 있는것은 아닙니다.
PE파일을 압축함으로써 리소스를 감출 수 있고 이는 바이러스 탐지 프로그램을 우회할 수 있습니다.
PE Protector란 패커는 리버싱 막기 위한 다양한 기능을 제공합니다.
이는 크래킹을 방지하고 코드를 보호하는 목적으로 사용됩니다.
실행 압축 실습
notepad.exe를 압축한다.
사용할 패커는 UPX로 아래 주소에서 다운받을 수 있다.
https://github.com/upx/upx/releases/tag/v4.0.2
Release v4.0.2 · upx/upx
Please see the file NEWS for a detailed list of changes. Note: all versions are functionally equivalent, i.e. each version can handle all executable formats, so you only need the file that runs on ...
github.com
다운로드 후 UPX실행시 다음과 같이 나온다.
upx -o [압축한 파일 이름] [압축할 파일 이름]
UPX패킹이 파일의 크기를 줄이는 방법은 첫번째 섹션을 0으로 만드는 것입니다.
압축해제 코드와 압축된 원본코드는 두번째 섹션에 있습니다.
실행 시 해제 후 첫번째 섹션에 풀어버림으로써 실행됩니다.
PE View를 보면 메모리 할당 공간은 크지만 실제 차지하는 크기는 0입니다.
UPX는 실행 시 EP → 압축 해제 → OEP 로 가는 구조로 이루어진다.
따라서 OEP를 찾는 방법을 알아야 한다.
Base Relocation Table
파일 실행시 dll파일이 로딩되는데, 로딩되는 메모리 주소에 이미 다른파일이 있으면
다른 비어있는 주소 공간에 로딩됩니다. 이를 PE 파일 재배치라고 합니다.
PE 파일 재배치 과정
1. 프로그램에서 하드코딩된 주소 위치를 찾는다
2. 읽은 후 주소값을 ImageBase만큼 뺸다
3. 실제 로딩 주소를 더해 실제 주소로 재배치
EX)
#1 - 프로그램에서 하드코딩된 주소 010010C4값을 찾음
#2 - ImageBase(1000000)을 뺸다 → 010010C4-01000000 = 000010C4
#3 - 실제 로딩 주소(00AF0000)을 더함 → 000010C4+00AF0000 = 00AF10C4
.reloc 섹션 제거
프로세스가 생성될 때 exe파일이 가장 먼저 메모리에 로딩되기 때문에
exe파일은 Base Relocation Table의 영향을 크게 미치지 않습니다.
이번에는 PE파일의 reloc섹션을 제거해보겠습니다.
HxD로 해당 옵셋부터 파일 끝까지 삭제
섹션이 하나 줄었으므로 Number of Sections값을 -1
reloc섹션을 제거하면서 전체 이미지 크기가 줄었으므로 이미지 크기값도 변경한다.
섹션 헤더에 나온 값을 Section Alignment에 맞게 계산하여 전체 이미지값에서 뺸다.
인라인 패치 실습
인라인 패치란 압축되어 수정하기 어려운 코드를 변경하고 싶을 때 사용하는 기법이다.
압축된 파일이 EP → OEP로 가는 구조를 이용한다.
Code Cave라는 패치 코드를 제작하고 EP → Code Cave → OEP 방식으로 실행
실습 예제 unpackme#1.exe
실행 시 다음과 같은 메세지 박스가 출력된다
EP에서 내려가다보면 다음과 같이 복호화 루프가 나온다.
메세지 박스를 출력하는 SendMessageA API를 활용하여 내용이 출력되는 영역을 찾는다.
패치 코드를 설치하는 방법은 파일의 빈 영역에 설치하거나, 섹션을 추가/확장하여 설치한다.
PE view를 통해 00401280~00401400에서 Null-padding영역임을 알아낼 수 있다.
다음과 같이 내용을 추가하고 저장후 실행
참고서적
이승원, 「리버싱 핵심원리」, 인사이트, 2012, 193p ~ 283p
https://www.yes24.com/Product/Goods/7529742
리버싱 핵심 원리 - YES24
리버서라면 꼭 알아야 할 핵심 원리를 모두 담았다리버싱이란 프로그램의 내부를 깊이 들여다보고 조작할 수 있는 기법이다. 이는 우리가 흔히 사용하는 상용 프로그램 등에도 가능하기 때문에
www.yes24.com
'리버스 엔지니어링 > 2부) PE File Format' 카테고리의 다른 글
[rev] 리버싱 핵심원리 2부) PE File Format 13장 (2) | 2023.03.07 |
---|