보안/악성코드

[3장]동적 분석

haerim9.9 2025. 4. 8. 23:21

이 글은 아래의 책을 읽고 공부 목적으로 작성됨.

몬나파 K A, 「악성코드 분석 시작하기」


 

동적분석 : 악성코드 실행 후 다양한 모니터링 활동을 수행.

-> 목표 : 악성코드 행위, 시스템에 끼친 영향과 관련된 실시간 데이터 수집.

 

여러 유형의 모니터링

  • 프로세스 모니터링 : 프로세스 활동 모니터링, 악성코드 실행 중 생성한 결과의 속성을 검사.
  • 파일 시스템 모니터링 : 파일 시스템 실시간 모니터링.
  • 레지스트리 모니터링 : 접근/수정된 레지스트리 키, 악성코드 바이너리가 읽거나 작성한 레지스트리 데이터 모니터링.
  • 네트워크 모니터링 : 시스템으로 유입되거나 외부로 나간 라이브 트래픽 모니터링.

 

랩 환경 설정 후, 분석 도구 호스트 머신에서 다운. 도구를 가상머신에 전송하거나 설치, 클린 스냅샷 생성.

*스냅샷 : VM에서 사진찍듯 현재 가상 머신의 상태 저장. 사용자가 원하면 언제든지 그 상태로 돌아갈 수 있음.

(클린 스냅샷 = 동적 분석 전의 상태가 있어야 악성코드 실행 전으로 돌아갈 수 있어서 "클린"이라 부른 것으로 추측됨.)

 


모니터링 도구

 

프로세스 해커

오픈 소스, 다목적 도구. 시스템 리소스 모니터링에 도움. 실행 중인 프로세스 조사, 프로세스 속성을 살펴볼 수 있음.

  • 프로세스 속성 조사 : 프로세스명 오른쪽 클릭 - 속성(Properties) 선택

프로세스 모니터

고급 모니터링 도구. 프로세스가 파일 시스템, 레지스트리, 프로세스/스레드 활동의 실시간 상호작용 보여줌. 실행 시 모든 시스템 이벤트를 캡처함.

  • 이벤트 캡처 중지 : Ctrl+E
  • 모든 이벤트 삭제 : Ctrl+X
  • 필터링 기능 : 필터(Filter) 메뉴 선택 - 필터(Filter) 선택 / Ctrl+L

노리벤(Noriben)

악성코드 런타임 지표를 수집, 분석, 리포트하는 데 도움주는 파이썬 스크립트. 악성코드 관련된 이벤트에 집중할 수 있는 필터 제공.

프로세스 모니터와 함께 동작. 파이썬 스크립트 실행 전 프로세스 모니터를 동일한 폴더에 복사할 것. 노리벤 실행 시 프로세스 모니터 실행.

  • 모니터링 종료(노리벤, 프로세스 모니터 종료 -> 종료 시 텍스트 파일과 CSV 파일을 결과로 저장.) : Ctrl+C
  • 카테고리 기반 이벤트 요약 : 텍스트 파일
  • 타임라인순 이벤트 : CSV 파일

와이어샤크(Wireshark)

악성코드 실행 결과로 생성되는 네트워크 트래픽 캡처. -> 악성코드가 사용하는 통신 채널 이해에 도움. 네트워크 기반 지표 파악에 도움.

  • 리눅스 와이어샤크 실행 명렁어 : sudo wireshark
  • 트래픽 캡처 : (캡처 - 옵션 선택 / Ctrl+K) - 네트워크 인터페이스 - 시작

INetSim

표준 인터넷 서비스(DNS, HTTP/HTTPS, 기타)를 시뮬레이션하는 무료 리눅스 기반 소프트웨어 스위트(suite). -> 악성코드가 작동하는 데 필요한 서비스 제공에 도움.

그외 : 비표준 포트로 연결하는 접속을 처리하는 더미 서비스 실행 / 통신 로깅 / 확장자 기반 어떤 파일이라도 반환하도록 설정 가능.

 


동적 분석 단계

  • 클린샷으로 복원 : 가상머신을 클린 상태로 복원.
  • 모니터링/동적 분석 도구 실행 : 악성코드 샘플 실행 전, 모니터링 도구를 관리자 권한으로 실행.
  • 악성코드 샘플 실행 : 관리자 권한으로 샘플 실행.
  • 모니터링 도구 종료 : 악성코드 바이너리 일정 시간 동안 실행 후 종료.
  • 결과 분석 : 모니터링 도구에서 데이터/리포트 수집 후 분석. 악성코드 행위 및 기능 확인.

 

악성코드 실행 파일 분석

1. 샘플 정적 분석

  • 파일 유형, 암호 해시 확인. -> 예시로, 이를 통해 32비트 실행 파일이란 사실을 알 수 있음.
  • string 유틸리티 이용해 바이너리에서 ASCII 문자열 추출. -> URL, 명령어 등의 단서 확보 가능.
  • API의 존재(예시로 WinExec 같은). -> 다른 프로그램 호출하는 악성코드 기능 나타냄.
  • 바이러스토털 데이터베이스에 해시 값 질의.

 

2. 샘플 동적 분석

  1. 윈도우 VM, 리눅스 VM 클린샷으로 복원.
  2. 윈도우 VM에서 프로세스 해커 관리자 권한으로 실행. -> 프로세스 속성 파악.
    노리벤 실행. -> 악성코드와 시스템 간 상호작용 관찰.
  3. 리눅스 VM에서 INetSim 실행. -> 네트워크 서비스 시뮬레이션.
    와이어샤크 실행. -> 네트워크 트래픽 캡처.
  4. 모든 모니털이 도구 실행. 악성코드 관리자 권한으로 약 40초간 실행.
  5. 40초 후 윈도우 VM에서 노리벤 중지. 와이어 샤크 리눅스 VM에서 중지.
  6. 결과 수집 및 검사, 악성코드 행위 파악.

 


동적 링크 라이브러리 분석

 

동적 링크 라이브러리(DLL) : 다른 프로그램에서 사용할 수 있는 함수를 담고 있는 모듈.

DLL 구현 이점 : 여러 애플리케이션에서 해당 코드 공유 가능.

 

윈도우 운영 시스템 : API이라 불리는 다양한 함수를 익스포트하는 다수의 DLL 포함. -> 이를 통해 프로세스가 파일 시스템, 프로세스, 레지스트리, 네트워크, GUI와 상호작용.

 

CFF 익스플로러 도구에서 익스포트 함수 표시 : 함수 익스포트한 PE 파일 로드. -> 익스포트 디렉터리(Export Directory) 클릭.

 

공격자가 DLL 사용하는 이유

  • DLL 실행하려면 호스트 프로세스 필요. 어떤 프로세스에서든 DLL 로드 가능.
    -> 악성코드 행동 숨길 수 있음. 호스트 프로세스를 통해 악의적인 활동이 발생한 것으로 보이게 함.
  • 실행 중인 프로세스에 DLL 삽입 시, 시스템에 대한 지속 공격 가능.
  • DLL을 메모리 공간에 로드하면 DLL은 전체 메모리 공간에 접근 가능. -> 프로세스 기능 조작 가능(예시로, 자격 증명 훔쳐서 조작).
  • 실행 파일 분석보다 어려움.

 

DLL 분석

1. rundll32.exe

DLL 실행 시 프로세스 필요. -> 윈도우에서 rundll32.exe를 이용해서 DLL 실행 및 익스포트한 함수 호출 가능.

rundll32.exe <DLL 전체 경로>, <익스포트 함수> <선택적 인수>
  • DLL 전체 경로 : DLL 전체 경로 지정.
  • 익스포트 함수 : DLL이 로드된 후 호출될 DLL의 함수.
  • 선택적 인수 : 익스포트 함수가 호출됐을 때 전달.
  • 쉼표 : 올바른 문법을 위해, DLL 전체 경로와 익스포트 함수 사이에 쉼표 필요.

rundll32.exe 동작

  1. 커맨드 라인 인수 우선 검증. 문법이 틀리면 rundll32.exe 종료.
  2. 문법이 올바르면 전달받은 DLL 로드. DLL 로드 시, DLL 엔트리 포인트 함수 실행. DLLMain 함수 호출.
  3. 익스포트 함수의 주소를 얻고 함수 호출. 주소 파악 불가능한 경우 rundll32.exe 종료.
  4. 선택 인수가 존재하면 이를 전달.

DLL 변형 예시

  1. 익스포트가 없는 DLL : 공격자는 익스포트 함수 없는 DLLMain 함수에 악의적인 기능 구현 가능.
    -> DLLMain 함수에 익스포트가 없어도 rundll32.exe 실행 시에 <익스포트 함수>가 필요하다. 존재하지 않는 익스포트 함수를 끼워넣으면, 에러가 발생해도 DLL이 실행됨.
  2. 익스포트 포함한 DLL : 
    DLL이 익스포트한 함수가 2개.
    임의의 <익스포트 함수> 입력 : DLL의 엔트리 포인트에 어떤 기능도 구현되지 않아서 어떤 행위도 시작하지 않음.
    익스포트 함수 2개 중 하나를 <익스포트 함수>에 입력 : C2 서버와 HTTPS 통신 시작. -> 해당 익스포트 함수가 네트워크 기능 구현하고 있음을 추측할 수 있음.
  3. 익스포트 인수 갖는 DLL : 
    파일을 삭제하는 기능을 가진 익스포트 함수, 삭제할 파일을 인수로 가짐.

 

2. 프로세스 체크

일부 DLL : 특정 프로세스에서 실행되는지 확인 -> 다른 프로세스에서 실행되는 경우, 행위 변경하거나 스스로를 종료함.

이 경우, 특정 프로세스에 DLL을 삽입해야 한다.

 

RemoteDLL

시스템의 어떤 실행 프로세스에도 DLL 삽입할 수 있도록 함.

세 가지 방법으로 DLL 삽입이 가능하며, 한 가지 방법이 실패해도 다른 방법으로 시도 가능.