목차
패킹이란?
패킹은 파일의 크기를 줄이기 위해 압축하는 것을 말한다. 파일의 코드를 숨기기 위해 패킹을 하기도 한다.
UPX는 패킹 도구 중 하나다.
notepad.exe를 사용한 UPX 패킹
UPX를 사용해 32bit의 notepad.exe를 패킹했다.
패킹한 파일과 원본 파일의 크기를 비교해보면 크기가 다르다.
왼쪽은 원본 파일이고 오른쪽은 패킹한 파일이다. 두 파일의 PE구조가 다른 것을 알 수 있다.
UPX 언패킹
ctrl+F8을 하면 EntryPoint에서 멈춘다. 파일의 entrypoint는 10154F0이다.
pushad 명령어는 모든 레지스터의 값을 스택으로 백업하라는 명령어다.
*EntryPoint : 실행 파일의 코드 시작점을 의미
esi(복사할 데이터의 주소를 저장하는 레지스터)에는 1011000 edi(복사한 데이터를 저장할 목적지의 주소를 저장하는 레지스터)에는 1001000이 들어간다.
해당 주소에 가면 아직 아무 데이터도 없다.
코드를 실행하는데 이 반복문을 실행하니까 1001000에 값이 생겼다.
코드를 보니까 edi의 값들을 esi에 복사하는 반복문으로 보인다.
작은 반복문인줄 알았는데 계속 실행해보니까 작은 반복문 여러개로 구성된 큰 반복문이다.
반복문의 끝 부분에 bp를 걸고 코드를 실행해서 반복문을 빠져나왔다.
반복문을 빠져나오고 1001000에 가보니 값이 채워졌다.
다시 코드를 실행하면 다음과 같은 반복문을 만나게 된다. bp가 걸린 코드에서 edi의 주소를 가보면 함수들의 문자열들이 있다.(아래 사진) 이 반복문은 IAT를 복원하는 과정이다.
위의 반복문을 빠져나와서 코드를 보면 popad라는 명령어를 통해 레지스터를 다시 원래대로 복원한다.
아래의 jmp notepad_upx.100739D 코드를 보면 어딘가로 분기하는 것을 볼 수 있다.
그런데 이 주소가 원본 파일의 EP 주소다.
해당 주소로 점프하려는데 계속 반복문을 돌길래 값을 수정해서 반복문을 빠져나왔다.
점프한 곳의 코드를 원본 코드와 비교해보니까 동일하다.
그러면 해당 부분으로 덤프를 생성해보자.
x96dbg의 메뉴에서 플러그인-Scylla에 가면 이런 창이 뜬다.
OEP 주소가 100739D로 맞게 잘 설정되어 있다.
IAT Autosearch 버튼을 누르면 자동으로 VA와 size 정보가 채워진다.
GetImports버튼을 누르면 dll들이 뜬다.
오른쪽의 dump 버튼을 누르면 덤프된 파일이 생성되는데 실행이 되지 않는다.
Fix Dump를 눌러서 방금 만든 덤프 파일을 열면 새로운 파일이 생성되는데 그 파일을 실행하면 메모장이 잘 실행된다.
'Study > 리버싱' 카테고리의 다른 글
[3] IAT와 EAT 로딩 과정 (0) | 2020.10.26 |
---|---|
[3] ㄷㄹㅎ 4,5 (0) | 2020.10.25 |
[2] 2주차 과제 (0) | 2020.09.20 |
[1] 32bit와 64bit의 함수 호출 규약 (1) | 2020.09.14 |
[0] 32bit 레지스터와 스택 구조, 스택 프레임 (0) | 2020.09.14 |