kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

DFIR/사고 대응

악성코드 분석 강의 정리

까마기 2020. 12. 19. 17:49
반응형

에버노트를 안쓰기로 하면서 기존에 묵혀두었던 정리안된 강의들으면서 정신없이 필기했던 메모들이 엄청 많다.. 올해 안에는 다 정리하는 걸로 하자. 틈틈히 조금씩 수정하다 보면 언젠가 도움이 되겠거니..

 

* 사전지식

1. CPU 및 어셈블리어 관련

: 아키텍쳐 별로 거기에 맞는 명령어를 넣어줘야 한다. (x86, x64, arm, mips는 CPU 아키텍쳐일 뿐)
: CPU가 C언어를 이해할 수 없기 떄문에 cpu가 이해할 수 있는 어셈블리어가 있는 것.

 

: 어셈블리어는 CPU 아키텍쳐에 따라 결정된다. 즉, CPU 아키텍쳐에 따른 어셈블리어를 사용해야 한다.
2. 메모리
: 루트킷 악성코드는 커널영역까지 침범하는 악성코드
: 윈도우 기반 악성코드 -> 프로그램 제작 과정 참고
: 바이너리와 시스템이 상호작용, 링크, 예로 printf 함수를 불러오는 부분을 추출
3. 어셈블리 기본
: 모든 파일에는 헤더, 데이터, 코드가 있다. 
: 실행 시 나름의 규칙에 따라 메모리에 올라간다. 규칙의 기준은 PE구조이다. exe는 PE구조에 맞게 설계되어야 하며, 그래야지만 메모리까지 충돌없이 올라간다.
4. 스택
: 어셈블리가 한줄한줄 실행 시킬때 스택과 레지스터와 데이터를 어떻게 주고 받는지를 아느냐가 리버싱이고 스택의 메커니즘을 이해야한다.
: CPU에는 레지스터가 있다.
* dll 관련 사전지식
dll은 라이브러리 : 기능을 제공하기 위해 만들어진 프로그램
 

- 악성코드 분석 도구

* 정적 분석(실행시키지 않고 실행) 시 사용 도구

1) 의심되는 문자열 - (Bintext / Strings)

ex)  wuauieop.exe 

<Binwalk>

  • 펌웨어 분석 툴로 분석, 리버싱, 데이터 추출을 할 수 있음.
  • Python 으로 작성되어 있으며 현재 리눅스 플랫폼만 지원함.
  • 특정 파일에서 어떤 파일들이 포함되어 있는지 확인하며 아래는 Binwalk 명령어를 한글화함.

 

Binwalk v2.0.0

Craig Heffner, http://www.binwalk.org

 

Usage: binwalk [OPTIONS] [FILE1] [FILE2] [FILE3] ...

 

시그니처 스캔 옵션 :

    -B, --signature                     특정 파일 시그니처 스캔

    -R, --raw=<str>                     지정된 바이트 수에서 파일 스캔

    -A, --opcodes                       특정 실행 Opcode 스캔

    -C, --cast                          주어진 데이터 타입으로 오프셋 캐스트 (데이터 형식/엔디언 -y 사용)

    -m, --magic=<file>                  사용자 정의 매직 파일을 지정

    -b, --dumb                          스마트 시그니처 키워드 사용X

 

추출 옵션 :

    -e, --extract                       알려진 파일 형식 자동으로 추출

    -D, --dd=<type:ext:cmd>             타입 시그니처 추출 (ext 확장, cmd 명령어 옵션 제공)

    -M, --matryoshka                    추출된 파일을 재귀적으로 검색

    -d, --depth=<int>                   matryoshka 재귀 깊이 제한 (디폴트 : 8 레벨 깊이)

    -j, --size=<int>                    추출된 파일 크기 제한

    -r, --rm                            추출 후 크기가 0 인 파일 제거

    -z, --carve                         파일로 부터 데이터 카빙 (단, 추출 유틸리티를 실행X)

엔트로피 분석 옵션 :

 

    -E, --entropy                       파일 엔트로피 계산

    -J, --save                          PNG 파일로 구별하여 저장

    -N, --nplot                         엔트로피 구별 그래프를 생성하지 않음

    -Q, --nlegend                       엔트로피 구별 그래프에서 범례를 생략

 

지능형 압축 옵션 :

    -H, --heuristic                     경험적으로 높은 엔트로피 데이터 분류

    -a, --trigger=<float>               엔트로피 트리거 레벨 설정 (0.0 - 1.0, 디폴트 : 0.90)

 

바이너리 디핑(Diffing) 옵션 :

    -W, --hexdump                       파일을 헥사덤프/비교로 수행

    -G, --green                         모든 파일 중에서 동일한 바이트 포함된 라인만 표시

    -i, --red                           모든 파일 중에서 다른 바이트 포함된 라인만 표시

    -U, --blue                          일부 파일 중에서 차이가 있는 바이트 포함된 라인만 표시

    -w, --terse                         모든 파일 비교 (단, 첫 번째 파일은 헥사덤프로 표시)

 

이진 시각화 옵션 :

    -3, --3D                            3D 이진 시각화로 생성

    -2, --2D                            3D 큐브 벽면만 데이터 포인트로 생성

    -Z, --points=<int>                  그래픽된 데이터 포인트의 최대 수 설정

    -V, --grids                         그래픽된 결과값을 x-y-z 그리드로 표시

 

원시 압축 옵션 :

    -X, --deflate                       원시 압축 스트림 스캔

 

퍼지 해시 옵션 :

    -F, --fuzzy                         파일/디렉토리에 퍼지 해시 매칭을 수행

    -u, --cutoff=<int>                  절단 비율을 설정

    -S, --strings                       전체 파일 중에서 내부 파일만 비교 문자열 설정

    -s, --same                          동일한 파일만 표시

    -p, --diff                          다른 파일만 표시

    -n, --name                          단지 이름이 같은 파일만 비교

    -L, --symlinks                      심볼릭 링크 설정

 

일반 옵션 :

    -l, --length=<int>                  바이트 넘버 스캔

    -o, --offset=<int>                  해당 파일 오프셋에서 스캔 시작

    -K, --block=<int>                   파일 블록 사이즈 설정

    -g, --swap=<int>                    스캔하기 전에 모든 n 바이트 반전

    -I, --invalid                       결과 표시를 무효로 표시

    -x, --exclude=<str>                 스트링값 결과에서 제외

    -y, --include=<str>                 스트링값만 결과 표시

    -f, --log=<file>                    결과물 설정

    -c, --csv                           CSV 파일로 결과물 설정

    -t, --term                          포맷 출력은 윈도우 창에 맞추기

    -q, --quiet                         표준 출력으로 간략하게 출력

    -v, --verbose                       버전 정보 보기

    -h, --help                          도움말 보기

 

 

 

2) 엔트로피 - ida-ent.exe (Entropy Calculator) 

: 엔트로피 - 코드의 분포, 엔트로피가 0 -> 모든 코드가 균일, 숫자가 높으면 코드가 몰려있다? 

--> 악성코드의 엔트로피 평균 값을 가지고도 판별

--> calculate 클릭 -> draw 클릭으로 엔트로피 값을 확인

 

 

3) resource hacker

 - 별도로 코드에서 기록하겟다는 정보, 아이콘 위치 및 이벤트 

 

 

4) CFF Explorer

 

: 파일 로드 -> c:\windows\system32\calc.exe
: CFF Explorer로 계산기, 노트패드, kernel32.dll 확인
: import directory
: 최소한 어떤 api를 사용했는지에 대한 목록을 볼 수는 있다. 
  • 만들고/접근/수정 날짜
  • 파일 형식, 파일 헤더정보 등
  • 사용하는 기능(API) - import directory
  • 컴파일러
  • 패킹 여부 -> pe viewer로만 얻을 수 있는 정보 , static 정보

: file size 와 PE size가 다르다. 정상적인 파일은 두 값이 똑같음

-> hex editor -> 4D 5A (MZ)검색 -> pe헤더의 시작을 알리는 고유 값인데 중간에도 있는 것을 보아 Dropper인 것을 알 수 있다.

dropper : exe안에 exe

downloader : exe안에서 exe를 다운로드

injector : exe안에서 현재 실행중인 프로세스로 악성코드 주입

5) 실제로 압축을 해제

ex) 정적분석 실습 (Unkhfc.exe)

6) Virustotal.com 및 malwares.com -> 벤더사에서 업로드 파일 또는 URL, md5 값을 malware로 분류하고 있는지의 여부 확인

7) APT 대응 솔루션 또는 Malware 샘플 제공 사이트를 통해 악성 바이너리 파일을 추출 또는 다운로드

8) packing 여부 판단(실행파일 압축)

Exeinfo PE (PE viewer 프로그램)으로 오픈하여 패커에 대한 정보를 확인해보자. Packing된 파일 vs. Unpacking된 파일 비교 - Exeinfo PE 프로그램 이용

- Packing은 실행파일을 압축하는 기술로 실행파일의 크기를 줄이거나, 디버깅을 방지하는 목적 등 몇가지 목적에 의해 적용

- 일반적으로 많은 악성코드 파일에 Packing이 적용되어 있는데, 그 이유는 악성코드를 담고 있는 파일의 크기를 줄여서 좀더 빠르게 유포하고 악성코드 파일을 디버깅하기 어렵게 만들어 빠른 대응을 방해하기 위해서 이다.

- 실행압축된 파일, 즉 Packing 파일 Unpacking 하기

1) tool 사용 (upx391w / upx391d 도구 사용)

2) Manual Unpacking (ollydbg)


동적 분석(실행하며 분석) , 행위 분석 

- IDA Pro 설치 및 실행 및 실습 파일 open
- 디스어셈블러에서도 파일 헤더 정보를 불러와서 분석을 먼저 해주며, 옵션 선택도 가능
 
IDA가 프로그램을 코드 영역을 디스어셈블하여 보여줌
IDA View-A 에서 스페이스 바를 누르면 뷰를 바꿔줌
 
x명령 코드 명령을 누가 참조하는지 
 
functions
-> RegOpenKeyExA
-> 구글 검색

 

악성코드 분석

- 초기분석, 정적분석, 동적분석(상세분석)

 

1. 초기분석

- Virustotal, Malware.com 등의 웹 사이트에서 이력 및 평판 조회 (파일, URL)

- 파일의 외형을 보고 판단 ex) .dll 및 .exe 파일

  → 확장자의 특성을 통해 파일 동작에 해단 정보를 유추

 

- 패킹 여부(실행압축 여부, PE)

: 일반적으로 많은 악성코드 파일에 packing이 적용되어 있음

: 패킹을 적용하는 이유

 → 악성코드를 담고 있는 파일의 크기를 줄여 빠르게 배포하기 위함

 → 악성코드 파일을 디버깅하기 어렵게 만들어 보안 입장에서의 빠른 대응을 방해하기 위함

 

2. 정적분석

- 파일을 실행시키지 않고 파일의 특성 및 동작방식을 유추

- String.exe 등의 도구를 사용

 

3. 동적분석

1) DLL 분석방법

- dll export 함수 종류 별 실행 방법을 알아야 함

: DLLRegisterServer /DLLUnregisterServer

: Export function Names ... etc

: ServiceMain

 

2) 함수 별 호출 원리(동작 원리)

- DLLRegisterServer / DLLUnregisterServer

: OleInitialize

: LoadLibrary to load thd DLL

→ GetProcAddress를 호출해서 DLLRegisterServer 또는 DLLUnregisterServer의 주소를 알아낸 후 해당 함수를 호출

→ 여기서 또 다른 Export 함수를 호출할 수 있음, regsvr32.exe 파일에 의해서 실행 시 호출됨)

ex) regsvr32.exe sample.dll → DLLRegisterServer 호출

ex) regsvr32.exe /u sample.dll → DLLRegisterServer 호출

 

- FreeLibrary

- OleUnInitialize

 

* OllyDbg로 %system%\regsvr32.exe 열어보기



반응형