UDPFlooding Malware를 제작하여 정적/동적 분석
*악성코드 분석하는 과정에서는 패킹하지 않은 파일을 가지고 분석하였다.
1. 정적분석
1.1 Virustotal(https://www.virustotal.com/gui/home)
악성 여부를 판단하는 안티바이러스 도구
악성코드 탐지에서 패턴 매칭 분석, heuristic(변조, 신종 등)을 탐지
71개의 항목 중에서 6개의 악성코드의 시그니처를 탐지하였다.
- Cylance, eGambit에서 Unsafe을 발견할 수 있었다.
해당 파일이 연결되어 있는 IP주소가 나오는 것을 확인할 수 있다.
1.2 PEiD/UPX
패킹은 악성코드를 은폐할 목적을 가지고 있으며, 문자열 검색이 안된다.
패킹과 난독화를 탐지하기 위해서 PEiD를 이용한다.
언패킹한 파일을 PEiD를 이용하여 확인한다.
- EP Section이 .text로 설정되어 있는 것을 볼 수 있다.
1.3 WinMD5Free SW
해시를 이용하여 악성코드와 정상코드의 고유 값을 비교하여 검증한다.
virustotal에 나온 MD5 해시 값을 이용하여 해당 파일이 실제 분석하고자 하는 파일이 맞는지 검증한다.
1.4 Dependency Walker
동적 링크 함수를 탐색할 수 있는 tool이다.
여기서 동적 링크 함수는 프로그램이 링크된 라이브러리 함수를 호출하면 라이브러리 내의 함수를 실행한다.
- 임포트(import) 함수: PE 파일 헤더에 실행 파일이 사용하는 특정 함수 정보를 포함한다.
- 익스포트(export) 함수: PE 파일에 익스포트 함수 정보가 포함되고, DLL이 가장 많이 존재한다.
KERNEL32.DLL
함수 이름 | 설명 |
WriteConsole function | 현재 커서 위치에서 시작하여 콘솔 화면 버퍼에 문자열을 쓴다. |
CreateFileA function | 파일 또는 I/O 장치를 작성하거나 연다. |
SetFilePointerEx function | 지정된 파일의 파일 포인터를 이동한다. |
HeapAlloc function | 힙에서 메모리 블록을 할당한다. 할당된 메모리는 움직일 수 없다. |
TerminateProcess function | 지정된 프로세스와 모든 스레드를 종료한다. |
IsProcessorFeaturePresent function | 지정된 프로세서 기능이 현재 컴퓨터에서 지원되는지 확인한다. |
GetCurrentProcessId function | 호출 프로세스의 프로세스 식별자를 검색한다. |
GetCommandLineA function | 현재 프로세스의 명령 줄 문자열을 검색한다. |
GetProcessHeap function | 호출 프로세스의 기본 힙에 대한 핸들을 검색한다. |
GetConsoleCP function | 호출 프로세스와 연관된 콘솔에서 사용된 입력 코드 페이지를 검색한다. 콘솔은 입력 코드 페이지를 사용하여 키보드 입력을 해당 문자 값으로 변환한다. |
WS2_32.DLL
함수 이름 | 설명 |
WSAStartup function | WS2_32.DLL을 사용할 수 있도록 초기화 하는데 사용하는 함수이다. |
WSACleanup function | WS2_32.DLL을 종료한다. |
recvfrom function | 소켓으로부터 자료를 수신한다. |
inet_addr function | 네트워크 주소 변환한다. |
sendto function | 특정 목적지로 데이터를 전송한다. |
htons function | 변환 함수를 u_short (빅 엔디안) TCP / IP 네트워크 바이트 순서 값 |
1.5 Strings
문자열 검색을 통하여 악성코드에 어떤 문자열이 있는지 확인할 수 있다. 패킹이 되어있는 악성코드는 본래의 악성코드가 가지고 있는 문자열을 검색할 수 없다.
- CompareStringEx 함수: 두 개의 유니코드 문자열을 비교한다.
- GetCurrentPackageId 함수: 호출 프로세스의 패키지 식별자(ID)를 가져온다.
- LCMapStringEx 함수: 이름으로 지정된 locale 경우 지정된 변환을 사용하여 입력 문자열을 다른 문자열로 매핑하거나 입력 문자열에 대한 정렬 키를 생성한다.
- LocaleNameToLCID 함수: locale 이름을 locale 식별자로 변환한다.
-> locale: 단순히 메시지 뿐만 아니라 숫자 표현법, 날짜 또는 시간 표현법 등 여러 가지에 사용될 수 있다
심볼파일(.pdb): C나 C++ 프로그램을 빌드한 후 생성되는 파일인데, 생성된 실행 파일을 디버깅할 수 정보를 제공해준다.
1.6 PeView
PE 파일 헤더 내 주요 정보를 확인할 수 있다.
.text | 실행 코드를 담고 있다 |
.rdata | 프로그램 내의 전역에서 접근 가능한 읽기 전용 데이터를 담고있다. 앞에 보았던 API 함수가 이 섹션에 존재하는 것을 알 수 있었다. |
.data | 프로그램을 통해 접근 가능한 전역 데이터를 저장한다. |
.rsrc | 실행 파일에 필요한 리소스를 저장한다. |
2. 동적분석
동적 분석이란 악성코드가 실행되는 시점을 모니터링하거나 악성코드가 수행된 이후 시스템 변화를 모니터링하는 것을 말한다.
기초 정적 분석이 완료된 후에 수행한다.
동적 분석을 하는 이유는 난독화나 패킹이 되었을 경우 분석가가 정적 분석 기법으로 한계에 이르렀을 때 수행한다.
2.1 ProcMon
프로세스 모니터(특정 레지스트리, 파일 시스템, 네트워크, 프로세서와 스레드 행위를 모니터링), 동작과 동시에 모든 시스템 호출을 감시한다.
2.2 Process Explorer
프로세스 익스플로러는 시스템에서 동작하는 프로세스를 모니터링할 수 있도록 도와주며 부모 자식 관계를 트리 구조로 화면에 출력한다.
2.3 Regshot
코드 실행 전후의 레지스트리 스냅샷을 찍고 비교하는 레지스트리 비교 도구
2.4 ApateDNS
네트워크 기반 행위 탐지하여 악성코드의 DNS 요청을 가장 신속히 볼 수 있다
2.5 Wireshark
패킷 스니핑을 이용하여 네트워크 트래픽을 잡아 로깅하는 패킷 캡처 도구이다.
3. UDP Flooding 공격
DoS(Denial of Service) 공격의 일종으로 대량의 UDP 패킷을 이용하여 대상 호스트의 네트워크 자원을 소모시키는 공격을 말한다.
4. 결론
첫 번째 정적 분석에서 안티바이러스 스캐닝인 VirusTotal, PEiD, UPX, Strings, WinMD5Free SW 그리고 Dependency Walker를 통해서 실행 파일 직접 실행시키지 않고 분석을 해보았다.
- 해당 파일에 대한 다양한 문자열도 알 수 있었고 EXE 파일이 포함하고 있는 DLL속의 Win API함수도 찾을 수 있었다.
두 번째 동적 분석에서는 정적 분석 기법으로 한계에 이르렀을 때 수행하여 해당 파일을 직접 실행시켜서 실행되는 시점을 모니터링하여 시스템에 대한 변화를 파악할 수 있다.
- 정적 분석을 통해서는 UDP Flooding 공격을 하고 있는지 몰랐지만 WireShark의 패킷 분석을 통해서 IP, PORT번호의 주소까지도 알아낼 수 있었다.
- 또한 동적 분석에서 나온 문자열들이 정적 분석에서 많이 나온 것을 보아 정적 분석을 통해서도 악의적인 행위를 하는지에 대한 예측도 중요한 것 같다.
'Security > Reversing' 카테고리의 다른 글
[악성코드동적분석] PracticalMalwareAnalysis-Lab03-02 분석 (0) | 2020.07.28 |
---|---|
[악성코드동적분석] PracticalMalwareAnalysis-Lab03-01 분석 (0) | 2020.07.28 |
[UDP Flooding] UDP Flooding Malware 제작 (0) | 2020.07.28 |
[x86 디스어셈블리 속성] 어셈블리 실습 (0) | 2020.05.28 |
[악성코드정적분석] PracticalMalwareAnalysis-Lab01-04 분석 (0) | 2020.04.25 |