: Size of Raw Data(원래 데이터 크기)보다 Virtual Size(가상 크기)가 월등히 크다면 다른 파일을 올리기 위함으로 의심해 볼 수 있음, 섹션의 이름 변경 여부를 확인
⑥ DLL 의존성 조사 by Dependency Walker
- Kernel32.dll : 메모리, 파일 ,하드웨어 접근과 조작
- Ntdll.dll : 윈도우 커널 인터페이스
- Advapi32.dll : 서비스 관리자, 레지스트리 같은 추가 윈도우 핵심 컴포넌트
- User32.dll : 유저 인터페이스(버튼, 스크롤바, 사용자 행위 제어, 반응 컴포넌트)
- Gdi32.dll : 그래픽 보기 및 조작
- WS2_32.dll : 윈도우 소켓 네트워크 (네트워크 통신)
- Wininet.dll : FTP, HTTP, NTP와 같은 상위 수준 프로토콜 구현 (네트워크 통신)
⑦ 리소스 확인 by Resource Hacker
: 아이콘/메뉴/대화상자/버전정보 섹션, 문자열 테이블
+) Dropper : 리소스에 실행 파일이 들어가 있음(프로그램이 이를 같이 실행하게 됨)
<Lab01-01.exe, Lab01-01.dll 기초정적분석>
1. 기존 안티바이러스 시그니처에 일치하는 파일이 존재하는가?
- Yes
2. 이 파일은 언제 컴파일 되었는가?
- Lab01-01.exe의 컴파일 시점은 2010/12/19 16:16:19 이다. 같은 방법으로 Lab01-01.dll을 확인한 결과,컴파일 시점은 2010/12/19 16:16:38 이었다.
둘의 컴파일 시간차이가 별로 안나는 것으로 보아 같이 동작하는 것으로 예상된다. (exe가 dll 파일을 동적으로 호출하는 방식일 것이다.)
3. 이 파일이 패킹되거나 난독화 징후가 있는가? 무엇으로 판단했는가?
- VirusTotal과 PEiD에서 확인한 결과, 두 파일 모두 MicrosoftVisualC++6.0버전에서 정상적으로 컴파일된 것을 확인할 수 있고,EPSection 정보도 .text로,따로 파일이 패킹되거나 암호화되지 않았음을 알 수 있다.
왼(Lab01-01.exe), 오(Lab01-01.dll)Lab01-01.dll의 Import - VirusTotal에서 확인
4. 임포트를 보고 악성코드 행위를 알아낼 수 있는가? 그렇다면 어떤 임포트인가?
- ① Lab01-01.exe
CopyFile, FindFirstFile, FindNextFile, FindClose, CreateFile, CreateFileMapping, MapViewOfFile 등의 함수가 쓰인 것으로 보아...
(예측) 파일을 복사한 후, 해당 파일이 존재하는지 찾은 뒤 찾는 행위를 그만두고, 복사한 파일을 복제하기 위한 파일을 하나 생성하는 행위를 하는 것 같다. (정상적 파일을 복사한 후, 악성코드를 심은 다음 다시 배포하는 게 아닐지 예상)
② Lab01-01.dll
Sleep, CreateProcess, CreateMutex, OpenMutex, CloseHandle 등의 함수가 쓰인 것으로 보아...
(예측) 잠시 프로세스를 멈춘 후, 새로운 프로세스를 만들고, 동일 프로그램의 중복실행을 막기위해 Mutex를 생성하고 실행하는 것 같다. (백도어로 작용할 것 같다)
그리고 PEview에서는 보이지 않던 WS2_32.dll(네트워크 통신을 하는 윈도우 소켓 네트워크)에 쓰인 Import 함수의 내용을 VirusTotal 사이트에서 볼 수 있었다.
socket, closesocket, inet_addr, send, connect 등의 함수가 쓰인 것으로 보아...
(예측) 호스트에서 외부 네트워크와 소켓으로 연결한 후 백도어로 작용하여 외부 네트워크에 정보를 전송할 것이다.
strings 툴을 이용한 파일 문자열 확인
5. 감염된 시스템에서 검색할 수 있는 다른 파일이나 호스트 기반의 증거가 존재하는가?
- Lab01-01.exe를 자세히 보면 kernel32.dll이 아닌 kerne132.dll 파일이 사용된 것이 보인다. Import 함수를 통해 예측한 것을 바탕으로 생각해보면 kernel32.dll의 내용을 복사하여 kerne132.dll이라는 악성코드가 담긴 파일을 생성할 것으로 예상된다. 또한 Lab01-01.dll에서 발견된 127.26.152.13 문자열이 쓰였기 때문에 호스트와 연관된 것으로 보인다.
6. 감염된 장비에서 이 악성코드를 발견하기 위해 사용한 네트워크 기반의 증거는 무엇인가?
- WS2_32.dll을 사용
7. 이 파일의 목적은 무엇이라고 판단했는가?
- Lab01-01.exe 는 C:/windows/system32/kerne132.dll 생성하며, kernel132.dll가 Lab01-01.dll파일로 보이며, 이 dll파일은 백도어로 작용해 외부와 통신하며 시스템 정보등을 전송할 것이다.
+) <Lab01-04.exe 기초정적분석>
이 파일은 리소스 섹션에 하나의 리소스가 있다. Resource Hacker를 이용해 리소스파일을 점검하고 리소스를 추출해보자. 리소스로부터 무엇을 알 수 있는가?
Resource Hacker에 Lab01-04.exe 올리기
리소스인데 실행 파일(exe)의 패턴(4D 5A, MZ)을 발견할 수 있었다.
이는 리소스에 실행 파일을 숨긴 후 실행 시 숨겨진 exe를 함께 배포하는 것으로 보인다. Dropper의 전형적인 예시같다.
기초 동적 분석
- 프로그램을 직접 실행하며 분석
- 프로그램의 영향 쉽게 파악
- 악성코드 실행 전후 상태를 조사 및 분석
1. 악성코드 실습 시 발생하는 호스트/네트워크 환경 구성
2. 파일, 프로그램 실행, 레지스트리, 서비스 등 관련 항목 변경 사항 확인
3. 실행 시 발생하는 네트워크 트래픽 분석
동적 분석에 사용하는 도구?
1. 프로세스 모니터(procmon.exe)
: 특정 레지스트리, 파일 시스템, 네트워크, 프로세스, 스레드 행위를 모니터링
+) 한계 : 특정 GUI와 I/O 제어를 통한 루트킷 탐지 불가, 네트워크 행위에 대해 일관성 있는 탐지 불가
2. 프로세스 익스플로러(procexp.exe)
: 프로세스(EPROCESS 구조체)에 관련된 많은 내용을 확인 가능
: 분석에 아주 유용한 도구
: 다양, 정확
3. RegShot
: 두 레지스트리의 스냅샷을 찍고 비교
: 악성코드는 자동실행을 위해 레지스트리를 자주 건드림
4. INetSim
: 맬웨어에게 가짜 서비스를 제공하기에 최고의 도구!
: 알려지지 않은 맬웨어 샘플의 네트워크 동작에 대한 런타임 분석을 수행하기 위한 도구
: 실험실 환경에서 맬웨어가 일반적으로 사용하는 인터넷 서비스를 시뮬레이트
: HTTP, HTTPS, FTP, IRC, DNS, SMTP 등 서비스를 실행
5. WireShark
: 네트워크 분석 프로그램
: 네트워크상 캡처한 데이터에 대한 네트워크/상위 레이어 프로토콜의 정보를 제공
: 패킷 캡처를 위해 pcap 네트워크 라이브러리를 사용
<Lab03-01.exe 기초동적분석>
VirusTotal에 올렸을 때
VirusTotal 올렸을 시 Import 함수도 제대로 안 보이고, Packer가 쓰인 듯 하여 PEiD로 확인하였다
PEiD
역시나 PEncrypt 라는 패킹 툴로 패킹이 되어 있다.
strings를 통한 파일 문자열 확인
1. 악성코드의 임포트 함수의 문자열은 무엇인가?
- 패킹되어 ExitProcess 밖에 확인할 수 없다.
strings로 확인 시 여러 레지스트리가 보이지만, 특히 Run 레지스트리에 들어가는 것들은 부팅시에 실행되는 것들이기 때문에 의심할 필요가 있으며, 중간에 보이는 url 주소는 악성코드가 실행되면서 이에 접근할 것이라고 예측할 수 있다.
2. 악성코드임을 의미하는 호스트 기반 표시자는 무엇인가?
동적 분석을 위한 툴을 모두 준비시킨 후 Lab03-01.exe 실행
RegShot, Procmon, Procexp, Wireshark 준비!
RegShot 결과
결과를 보면 레지스트리에 5개의 값이 추가되었고, 2개의 값이 수정이 되었다.
특히, HKLM\SOFTWARE\Microsoft\CurrentVersion\Run에 해당하는 레지스트리 키 값은 부팅 시 자동으로 시작하게 하는 역할을 한다. 따라서 사용자가 부팅할 때마다 이 악성코드가 실행되게 하는 목적이 있는 것 같다.
(strings에서 봤던 VideoDriver는 Run 레지스트리에 자기 자신을 등록하기 위한 키 이름이라는 것을 이제서야 알게 됨)
ProcMon
ProcMon에서 확인한 결과, strings에서 봤던 vmx32to64.exe는 C:\Windows\system32\아래에 생성하기 위한 파일 이름이라는 것을 알게 되었다.
C:\Windows\system32에 생성된 vmx32to64.exe 확인
왼(vmx32to64.exe), 오(Lab03-01.exe)
WinMD5로 확인한 결과, 두 파일은 정확히 일치했다
따라서 Lab03-01.exe파일이 자기 자신을 복사해서C:\Windows\system32\아래에 vmx32to64.exe라는 이름으로 파일을 생성함을 알 수 있다.
3. 악성코드를 인식할 수 있는 유용한 네트워크 기반의 시그니처가 존재하는가? 있다면 무엇인가?
- strings에서 봤던 www.practicalmalwareanalysis.com 를 통해 네트워크를 사용한다는 것을 예상할 수 있지만 더 분석해보겠다.
strings에서 본 url로 접속을 하고 이후에는 443포트를 통해 어떤 행동을 하는 것을 확인했다
: 파일(File)이 이식 가능한 다른 곳에 옮겨져도(Portable) 실행 가능하도록(Executable) 만든 포맷(Format)
출처 : 인프런_윈도우 악성코드(malware) 분석 입문 과정 강의자료
프로그래머가 작성한 코드는 CPU가 실행할 수 없다. 따라서 컴파일, 어셈블 과정을 거쳐 CPU가 이해할 수 있는 기계어로 이루어진 목적 파일로 변경된다. 하지만 이 목적 파일(obj)은 직접 실행할 수 없는 파일이다. 표준 라이브러리, 사용자 라이브러리 등을 포함하고 있지 않기 때문. 따라서 링킹을 통해 필요한 라이브러리를 obj 파일과 연결하는 과정(링킹)이 필요하고, 이 과정이 끝나면 실행 가능한 exe 파일이 생성된다.
<PE헤더 복구 실습>
실행되지 않는 파일PE 헤더 부분에 어떠한 값이 들어있다.크기 비교 결과 역시나 16바이트가 더 많다.HxD를 통해 해당 줄을 지워주고 저장정상 복구
또 다른 파일 예시. HxD의 [Analysis] - [File-compare] - [Compare] 등을 통해서도 쉽게 비교 가능
패커(Packer)
: 실행 파일 압축기
- 사용 목적 : PE 파일 내부 코드와 리소스(string, API 등)를 감추기 위한 목적
+ 프로텍터 (패킹 기술로 리버싱을 막기 위한 다양한 기법을 추가하는 것. 쓰레기 코드를 넣어 원본보다 크기가 커질 수 있음)
※ 각종 백신 우회 방법
- 시그니처 변경 (단순히 변수 몇 개를 추가 및 함수 위치를 변경하여 리빌드)
- 쓰레기 코드를 통한 우회 방법 (네 줄이 수행된 결과를 보면 아무것도 바뀌는 것이 없음(대칭 구조))
- 헤더 변조 (TimeDateStamp, Optional Header의 CheckSum, 메모리 속성 변조) -> 해시값 변경
- 대체 가능한 어셈블리어 (sub ebp, 7 >> add ebp, 7..)
- 실행조차 되지 않는 코드
* Themida
출처 https://www.oreans.com/Themida.php
: 지상 최고의 패커, 안티 디버깅과 안티 분석, 언패킹 분석을 매우 어렵게 하는 안전한 패커이다.
VMware, 디버거, 프로세스 모니터(ProcMin, Process Monitor) 분석을 방지하는 기능(자신을 분석하는 줄 알고)
패킹된 실행 파일은 이례적으로 크기가 큼
언패커가 존재하나 Themida 버전과 프로그램을 패킹할 때 사용한 설정에 따라 성공률이 다르다
<UPX>
오리지널 notepad 파일upx.exe ori_notepad.exe 명령어로 패킹언패킹은 이렇게. -d 옵션을 주면 됨원본 파일을 건드리지 않고 패킹된 새로운 파일 생성할 떄는 -o 옵션새로 생성된 파일
ori_notepad_upx 의 어셈블리 코드
UPX의 특징? PUSHAD & POPAD
먼저, 01015320 PUSHAD 명령어를 통해 EAX~EDI 레지스터 값이 스택에 저장,
그 후 POPAD를 통해 레지스터 복구 후 원래 코드의 Entry Point로 가게 된다.
upx 로 패킹되어 있는 파일PUSHAD 실행ESP 위치로 가서 Hardware Breakpoint를 건다그러면 POPAD 명령어까지 실행된 이후의 상황이 된다. 원래 처음의 레지스터 상태로 돌아온 것
00401000 이 OEP인 것을 확인할 수 있다.
(원본 프로그램 시작)
OllyDBG의 플러그인을 사용해 덤프를 뜨겠다Rebuile Import 체크 해제, DUMP 파일 따로 저장