본문 바로가기

4-3. 2023-2 심화 스터디/윈도우 악성코드 분석

[2023.11.11] 인프런 윈도우 악성코드(malware) 분석 입문 과정 강의 수강 - 섹션 4

5.1 악성코드 주요 행위 분석 1 - API, 파일시스템

윈도우 API

  • 대부분의 악성코드는 윈도우 플랫폼에서 동작
  • 운영체제와 밀접하게 상호작용

핸들(Handle)

  • 윈도우, 프로세스, 모듈, 메뉴, 파일 등과 같이 운영체제에서 오픈되거나 생성
  • 객체나 메모리 위치를 참조한다는 점에서 포인터와 같음
  1. 핸들요청
  2. 객체생성
  3. 핸들반환
  4. 객체조작요청 

파일 시스템 함수

  • 악성코드가 시스템과 상호작용하는 가장 일반적인 방식은 파일을 생성하거나 수정해 파일명을 구별하거나 기존 파일명을 변경
  • 식별자로 사용 가능
  • 파일을 생성해 그 파일에 웹 브라우징 내용을 저장한다면 해당 스파이웨어 형태일 가능성이 높음
함수 설명
CreateFile 파일을 생성하고 열 때 사용 기존 파일, 파이프, 스트림, I/O 장치를 열고 새로운 파일을 생성 dwCreationDiposition 인자는 이 함수가 새로운 파일을 생성하는지, 기존 파일을 오픈하는지 여부 제어
ReadFile WriteFile 파일을 읽고 쓰는 데 사용 두 함수 모두 파일을 스트림 형태로 운영 ReadFile은 파일에서 몇 바이트를 읽고 나면, 그 다음 몇 바이트를 읽는 형식을 가짐
CreateFileMapping MapViewOfFile 파일 매핑은 파일을 메모리로 로드해 쉽게 조작할 수 있게 함 CreateFileMapping : 파일을 디스크에서 메모리로 로드 MapViewOfFile : 매핑된 베이스 주소 포인터를 변환, 메모리 내 파일에 접근, 파일 포맷 파싱시 용이

 

특수 파일

  • 드라이브 문자와 폴더명으로 접근할 수 없는 파일도 존재

공유 파일

  • \\ServerName\share나 \\?\ServerName\share로 시작하는 이름을 가짐
  • 네트워크 상에 저장된 공유 폴더에서 디렉터리나 파일에 접근

네임스페이스를 통해 접근 가능한 파일

  • 운영체제 내에서 네임스페이스를 통해 접근
  • 네임스페이스 : 고정된 숫자의 폴더와 각각 저장하는 다른 유형의 객체
  • Win32 장치 네임스페이스는 접두사 \\.\를 이용 → 물리적 장치 접근하여 파일처럼 읽음

ADS(Alternate Data Streams) : NTFS 내의 기존 파일에 데이터를 추가 기능 제공

  • 한 파일에 다른 파일을 추가
  • 추가 데이터는 디렉터리 목록에 나오지 않고, 파일 내용 출력이 안됨
  • ADS 데이터는 normalFile.txt:Stream:$Data라는 규칙을 가짐

ADS를 사용한 프로그램 감추기 및 실행 실습

5.2 악성코드 주요 행위 분석 2 - 자동실행 레지스트리

윈도우 레지스트리

  • 운영체제와 설정이나 옵션 같은 프로그램 구성 정보를 저장
  • 수직 구조의 정보 데이터베이스 → 성능 향상!
  • 네트워킹, 드라이버, 시작, 사용자 계정, 다른 정보 등 거의 모든 윈도우 구성 정보 저장
  • 레지스트리를 활용하는 악성코드
    • 영구 데이터나 설정 데이터 저장
    • 컴퓨터 부팅 시마다 자동으로 동작할 수 있게 수정
레지스트리 구성 값 설명
루트 키(root key) 루트키라 부르는 다섯가지 최상위 부분으로 나눠짐 때로는 HKEY와 하이브란 용어를 사용
서브키(subkey) 서브키는 폴더 내의 서브폴더 역할
키(key) 키는 또 다른 폴더나 값을 저장할 수 있는 레지스트리 내 폴더 (루트키와 서브키는 모두 키다)
값 엔트리(value entry) 값 엔트리는 순차적인 이름과 값 쌍 임.
값이나 데이터(value or data) 레지스트리 엔트리 내에 저장된 데이터

 

레지스트리 루트 키

루트키 종류 설명
HKEY_LOCAL_MACHIN(HKLM) 시스템 전역 설정 저장
HKEY_CURRENT_USER(HKCU) 현재 사용자에 특화된 설정 저장
HKEY_CLASSES_ROOT 정의한 유형 정보를 저장
HKEY_CURRENT_CONFIG 현재 하드웨어 구성 설정, 특히 현재 설정과 표준 설정의 차이를 저장
HKEY_USERS 기본 사용자, 새로운 사용자, 현재 사용자의 설정을 정의

 

레지스트리 편집기 : regedit

  • 루트 키 : HKLM
  • 서브 키 : SOFTWARE, Microsoft, Windows, CurrentVersion, Run
  • 값 엔트리 : ASPDaemon, BluetoothAuthenticationAgent 등..

서비스

  • 악성코드가 새로운 코드를 실행하는 또 다른 방식은 서비스로 설치하는 방법
  • 백그라운드 애플리케이션으로 실행하는 서비스를 사용, 프로세스나 스레드 없이 실행(코드가 스케줄링돼 사용자 입력 없이 윈도우 서비스 관리자가 실행
  • 서비스 이용의 이점
    • SYSTEM 권한으로 실행
    • 운영체제 시작 시 자동으로 실행
    • 작업관리자에 프로세스가 보이지 않을 수 있음
  • 서비스 API
    • OpenSCManager : 서비스 제어 관리자에 핸들 반환
    • CreateService : 신규 서비스로 등록, 부팅 시 서비스의 자동/수동 시작 여부를 호출자가 지정
    • StartService : 서비스를 시작하고 서비스가 수동으로 시작하게 설정되어 있을 때만 사용

서비스 제어 sc.exe

  • API를 호출하는 대신 sc 매니저를 사용할 수도 있음.
  • sc.exe는 윈도우에 기본적으로 세팅이 되어있는 프로그램.

서비스 등록/시작

  • 등록 : sc create [서비스명] binpath = [서비스 파일 경로]
  • 시작 : sc start/stop [서비스명]
  • 삭제 : sc delete [서비스명]
  • 조회 : sc query [서비스명]

자동으로 시작하는 프로그램

  • Autoruns 는 운영체제가 시작 시 자동으로 실행하는 코드를 목록화
  • IE, 다른 프로그램으로 로드되는 DLL, 커널로 로드되는 드라이버 목록화
  • 자동으로 코드가 실행하게 되는 25~30 군데 위치를 조사
  • 전체 리스트가 아닐 수 있음

 

일반 레지스트리 함

  • 악성코드에서 레지스트리를 수정할 목적으로 사용하는 윈도우 API
API  설명
RegOpenKeyEx 편집과 질의용으로 레지스트리를 오픈
RegSetValueEx 레지스트리에 새로운 값을 추가하고 데이터를 설정
RegGetValue 레지스트리 내의 값 엔트리용 데이터를 반환
  • Reg Add : reg.exe를 console을 통해 실행가능.

.reg 파일을 이용한 레지스트리 스크립트

  • reg. 확장자를 가진 파일은 가독성이 있는 레지스트리 데이터를 포함
  • 더블 클릭하여 실행하면 담고 있는 정보를 자동으로 레지스트리로 병합해 수정

샘플 .reg 파일

 

5.3 악성코드 주요 행위 분석 3 - 네트워크, DLL, 스레드 등

 

버클리 호환 소켓

  • 버클리 호환 소켓 네트워크 기능은 Winsock 라이브러리에서 주로 ws2_32.dll에 구현
  • 버클리 호환 소켓 네트워크 함수
    API 설명
    socket 소켓 생성
    bind 호출 전에 소켓을 특정 포트로 할당
    listen 소켓이 인바운드 연결을 위해 리스닝하고 있음을 나타냄
    accept 외부 소켓 연결을 오픈하고 연결을 받아들임
    connect 연결을 외부 소켓으로 오픈하고 외부 소켓은 연결을 기다림
    recv 외부 소켓에서 데이터를 수신
    send 외부 소켓으로 데이터 발송

네트워킹 동작 방식

WinlNet API

  • Winsock API 보다 상위 수준의 API
  • Wininet.dll에 저장
  • HTTP,FTP와 같은 프로토콜을 구현
  • internetOpen : 인터넷 연결 초기화
  • internetOpenUrl : URL에 연결할 때 사용한다(HTTP 페이지나 FTP 리소스에 사용할 수 있음)
  • internetReadFile : ReadFile 함수 같이 프로그램이 인터넷에서 다운로드 한 파일에서 데이터를 읽음

DLL(Dynamic Link Libraries, 동적 링크 라이브러리)

  • 현재 윈도우에서 다양한 애플리케이션끼리 코드를 공유하는 라이브러리를 사용하는 방식
  • 다른 애플리케이션에 의해 실행할 수 있는 익스포트 함수를 포함
  • 정적 라이브러리는 DLL이전에 사용하던 표준 → 프로세스 별로 메모리에 로드

악성코드 제작자가 DLL을 이용하는 법

  • 악성코드 저장용 : exe 파일 프로세스당 하나만 가지기 때문에 dll을 사용하여 다른 프로세스에서 실행 가능
  • 윈도우 DLL 사용 : 거의 모든 악성코드는 윈도우와 상호작용할 수 있는 윈도우 OS DLL을 사용하여 악성코드 분석가에게 상당한 통찰력을 제공
  • 외부 DLL 사용 : 다른 프로그램과의 상호동작을 위해 외부 DLL을 사용
  • 윈도우 API를 활용해 직접 다운로드하지 않고 파이어폭스의 DLL을 이용

프로세스

  • 새로운 프로세스를 생성하거나 기존 프로세스를 변형해 현재 프로그램 외부에서 코드를 실행
  • CreateProcess API

스레드

  • 프로세스는 실행 컨테이너, 스레드는 윈도우 운영체제가 실행
  • 프로세스 내의 코드 일부를 실행

스레드 문맥

  • 운영체제가 스레드를 교체하기 전에 CPU의 정보를 스레드 문맥에 저장
  • 스레드가 CPU내부 레지스터 값 변경

뮤텍스를 이용한 내부 프로세스 조정 (뮤텍스 : 데이터의 무결성이나 원자성을 보증하기 위한 기능)

  • 뮤텍스 : 여러 프로세스와 스레드를 조정하는 전역 개체, 커널에서는 뮤턴트라고 부르기도 함
  • 뮤텍스 메커니즘의 특징
    • Atomicity : 하나의 쓰레드가스레드가 mutex를 이용해서 잠금을 “시도하는 도중”에 다른 스레드가 mutex 잠금 불가
    • Singularity : 만약 스레드가 mutex “ 잠금을 했다면” 해당 스레드가 mutex 잠금을 해제하기 전까지 다른 어떠한 스레드도 mutex 잠금 불가
    • Non-Busy Wait : 스레드는 다른 쓰레드가 락을 해제하기 전까지 “해당 지점에 머물러 어떠한 CPU 자원도 소비하지 않음”

뮤텍스 API

  • 생성 - CreateMutex
  • 열기 - OpenMutex
  • 삭제 - ReleaseMutex   

네이티브 API

  • 악성코드 제작사 사이에 흔히 사용하는 하위 수준의 윈도우 상호 작용 인터페이스
  • 악의적이지 않은 프로그램은 거의 사용하지 않음

 

  • 시스템, 프로세스, 스레드, 핸들, 기타 항목에 관한 정보 수집에 사용
    • NtQuerySystemInformation
    • NtQueryInformationProcess
    • NtQueryInformationProcess
    • NtQueryInformationFile
    • NtQueryInformationKey

5.4 연습 샘플 분석 1 - 기초 정적 분석

exeinfo로 Lab07_01.exe 실행

Microsoft Visual C++에서 컴파일 된 것을 알 수 있음

 

pestudio  Lab07_01.exe 실행

imports 분석

  • 뮤텍스 함수
    • CreateMutexA,x,-,-,kernel32.dll
    • OpenMutexA,x,-,-,kernel32.dll
  • 프로세스 제어
    • ExitProcess,x,-,-,kernel32.dll Section 4 15
    • CreateThread,x,-,-,kernel32.dll
    • TerminateProcess,x,-,x,kernel32.dll
  • 프로세스 정보
    • GetCurrentProcess,x,-,-,kernel32.dll
    • Sleep,x,-,-,kernel32.dll
    • GetCommandLineA,x,-,-,kernel32.dll
    • FreeEnvironmentStringsA,x,-,-,kernel32.dll
    • FreeEnvironmentStringsW,x,-,-,kernel32.dll
    • GetEnvironmentStrings,x,-,-,kernel32.dll
    • GetEnvironmentStringsW,x,-,-,kernel32.dll
    • GetStartupInfoA,x,-,-,kernel32.dll
    • GetOEMCP,x,-,-,kernel32.dll
    • GetModuleFileNameA,x,-,-,kernel32.dll
  • 안티 디버깅
    • UnhandledExceptionFilter,x,-,x,kernel32.dll
  • 파일 관리
    • GetFileType,x,-,-,kernel32.dll
    • WriteFile,x,-,-,kernel32.dll
  • 메모리 관리
    • HeapCreate,x,-,-,kernel32.dll
  • DLL 인젝션
    • VirtualFree,x,-,-,kernel32.dll
    • VirtualAlloc,x,-,-,kernel32.dll
    • GetProcAddress,x,-,-,kernel32.dll
    • LoadLibraryA,x,-,-,kernel32.dll
  • 서비스 관련
    • CreateServiceA,x,-,-,advapi32.dll Section 4 16
    • StartServiceCtrlDispatcherA,x,-,-,advapi32.dll
    • OpenSCManagerA,x,-,-,advapi32.dll
  • URL 오픈
    • InternetOpenUrlA,x,-,-,wininet.dll
    • InternetOpenA,x,-,-,wininet.dll
  • strings 분석

  • Malware 서비스 실행하는 것을 예측 가능

5.5 연습 샘플 분석 2 - 기초 동적 분석

SysAnalyser 프로그램 사용 

*위와 같이 설정 후 스냅샷 찍고 Start, 프로그램 실행 후 보고서가 나오기 전까지 아무것 도 건드리면 안 됨(SysAnalyzer가 감시하고 있음)

 

보고서 화면

*Report File View에서는 데이터가 보이지 않을 시 확인해도 됨

 

Start 시간은 있지만 End 시간 없음 → 프로그램이 아직 끝나지 않았음.

 

SysAnalyzer 창에서 대부분 확인

 

PID 272가 IEUser의 권한을 가지고 실행됨

포트 열린 흔적 존재, 포트 2개 열었음(1112, 1113)

-레지스트리 변경된 사항 기록됨

-서비스 관련된 경로

*스냅샷 찍고 메모, 스냅샷 찍고 메모 잘하기 → 나중에 다 보고서에 기록됨

 

레지스트리 변경 확인

Run에서 regedit 검색

SysAnalyzer에 경로로 이동

서비스가 등록이 되었다를 의미

 

API Log 확인

뮤텍스 등과 같은 API 함수 흐름 확인

 

Mutexes

HGL345 중요 (pestudio strings에도 있음) → 중복 실행을 방지하고 있는 것이 아닌 가?로 생각할 수 있음

 

5.6 연습 샘플 분석 3 - 고급 정적 분석

main 함수에 startServiceIDispatcherA를 볼 수 있다. (서비스를 실행하는 내용)

실행하면 sub_401040으로 들어가게 됨.->RealMain이라고 rename 해준다. 

 

뮤텍스 등록

ExitProcess 할 건지 CreateMutexA 할건지 나뉨. 중복방지를 위해서 HGL345가 쓰임

CreateThread를 통해 스레드를 생성

이때, 3번째 인자에서 스레드로 만들 함수 주소를 가리키고 있으므로 해당 주소로 이동

내용을 확인해 보면, 인터넷 익스플로어를 이용해 인터넷에 접속하고, 질의를 보내는 것 확인 가능

이때, 한 번만 작업을 진행하는 것이 아닌 자원이 생길 때마다 인터넷에 접속하는 것도 확인 가능

따라서, Lab07_01.exe는 Dos 프로그램