리버싱

Simcurity·2023년 5월 26일
0

리버싱

목록 보기
7/9

1. 패킹과 언패킹

패킹(Packing)이란 프로그램 코드 크기를 줄이려고 압축하거나 프로그램 분석을 어렵게 만들려고 암호화하는 것을 말합니다.
프로텍팅(Protecting)은 목적이 코드를 난독화하여 분석을 어렵게 만드는 기술이며 프로그램 실행 속도 저하와 프로그램의 크기가 증가하는 단점이 있습니다.
컴프레싱(Compressing)은 단순 압축을 하는 방법으로 초기에 하드디스크 용량이 작아 사용된 기술입니다.

UPX로 패킹된 파일은 언패킹에 필요한 코드 영역과 패킹된 데이터가 들어가 있는 영역, 그리고 언패킹된 데이터가 저장된 빈 공간으로 구성됩니다.

  1. 운영체제의 로더가 실행 파일을 메모리에 로딩합니다.
  2. 진입점(Entry point)으로부터 프로그램이 실행됩니다. 엔트리 포인트는 언패킹 코드 영역에 들어 있습니다.
  3. 언패킹 코드는 패킹된 데이터를 하나씩 읽어 압축을 풀고 공간에 원본 데이터를 저장합니다.
  4. 모든 코드가 언패킹되면 원 진입점에서부터 프로그램이 다시 시작됩니다. 원 진입점은 언패킹되기 이전 실행 파일의 진입점입니다.

UPX(Ultimate Packer for Executables)는 현재 가장 많이 사용하는 실행 압축 프로그램입니다.
Themida는 적용된 옵션마다 언패킹 방법이 다르기 때문에 풀기 어려운 강력한 프로텍터 중 하나입니다. 많은 악성코드가 Themida로 프로텍팅되어 있고 국내 많은 보안 프로그램이나 게임들이 실행 파일을 리버싱으로부터 보호하기 위해 Themida를 사용합니다.

2. UPX 패커

UPX는 오픈 소스 실행 압축 파일입니다. 윈도우 뿐 아니라 리눅스, 유닉스 등 다양한 운영체제를 지원하고 있습니다.
UPX는 압축과 해제에 효율적인 알고리즘을 제공하고 있으며 압축 효율도 높습니다.
UPX를 다운 받고 전에 해보았던 abex1.exe파일을 upx.exe가 있는 위치로 옮겨줍니다.

그리고 cmd에서 upx.exe 파일 위치로 가서 패킹을 해줍니다.

upx -o '패킹 후 파일이름' '패킹 전 파일이름'

Ratio는 원본 파일에 대한 출력 파일의 압축 비율입니다.
8KB였던 파일이 7KB가 되었습니다.

이제 Detect It Easy로 파일을 열어보겠습니다.

우선 패킹하기 전의 파일 정보로 델파이로 작성된 프로그램으로 엔트리 포인트와 정상적인 PE파일 구조와 섹션을 나타내고 있습니다.

다음은 UPX로 패킹된 프로그램의 정보입니다.
우선 UPX로 패킹되었고 프로그램의 크기가 줄어들었습니다. 또한, 정상적인 PE파일의 구조가 아닌 섹션이 UPX0, UPX1, .rsrc 만 존재합니다. UPX0에는 언패킹된 코드가 존재하는 곳입니다.
또한 엔트리 포인트도 기존의 401000이 아닌곳으로 변경되었습니다.

3. 언패킹과 OEP(Original Entry Point)

엔트리 포인트는 프로그램의 제어권이 운영체제에서 사용자 코드로 넘어가는 부분입니다.
Address Of Entry Point + Image Base 의 값이 실질적인 엔트리 포인트의 주소입니다.
패킹된 프로그램은 프로그램이 종료되면 언패킹된 코드가 메모리 어딘가에 저장되어있습니다.
(왜냐하면 프로그램 진행 중 한줄 씩 언패킹하여 실행하므로)
이제 수동으로 언패킹 과정을 봐보겠습니다.

가장 처음 PUSHAD는 모든 레지스터 값을 스택에 백업하는 동작을 수행합니다.
그 후 언패킹 코드가 따라옵니다. 이 때 압축된 데이터를 풀어 메모리 특정 영역에 저장합니다.

언패킹이 모두 완료되면 POPAD명령으로 레지스터 값들을 모두 복구시켜줍니다.

그 후에 OEP (00401000)으로 점프하여 오리지널 코드를 실행합니다.
이 때 OEP아래에 오는 코드들이 패킹되기 전의 원본 코드를 볼 수 있습니다.
이제 프로그램 덤프를 위해 OllyDumpEx 플러그인을 설치해주겠습니다.
그리고 프로그램 덤프 시 다음과 같은 창이 뜹니다.

밑줄 친 부분은 패킹된 프로그램의 엔트리 포인트로 MUP방법이므로 직접 수정을 해주어야 합니다.
앞서 찾은 엔트리 포인트인 00001000을 입력해주고 덤프를 하여 파일을 만들어줍니다.

덤프 파일 실행 시 오류가 발생합니다.
이유는 윈도우 프로그램의 경우 DLL형태의 시스템 라이브러리를 사용하는데 어떤 함수에서 어떤 DLL을 불러와 사용할지 저장하는 IAT테이블이 손상되었기 때문입니다.
덤프 과정에서 쉽게 IAT테이블은 손상됩니다.
그러므로, IAT테이블의 정보를 알맞게 갱신해주어야 합니다.

DIE에서 덤프 파일을 열고 Import를 누르면 IAT테이블의 상태를 보여주는 화면이 나옵니다.

이것은 원본 abex1.exe파일의 IAT 테이블로 GetDriveTypeA함수를 사용하는 것을 알 수 있습니다.

이것은 덤프 파일의 IAT 테이블로 값이 지정되어 있지 않습니다.
손상된 IAT 파일을 복구하려면 PE헤더 정보를 분석해서 사용하는 DLL과 함수에 대한 정보를 일일이 맞추어야 합니다.
IAT 복구시 사용하는 LoadPE 프로그램으로 IAT 복구를 해보겠습니다.

4. LoadPE


Rebuild PE 클릭 후 IAT를 복구할 파일을 선택합니다.
복구 후 올리디버거로 덤프 파일을 열면 언패킹된 프로그램 파일을 디버깅할 수 있습니다.

악성코드 분석의 기초인 언패킹 과정을 MUP 방식으로 해보았습니다.

0개의 댓글