이 글은 아래의 책을 읽고 공부 목적으로 작성됨.
몬나파 K A, 「악성코드 분석 시작하기」
정적분석 도구와 기법
파일 유형 파악
의심스러운 바이너리의 파일 유형 구분. -> 운영 시스템과 아키텍처(32비트 또는 64비트 플랫폼) 식별에 도움.
윈도우 기반 악성코드 확장자 : 대부분 .exe / .dll / .sys 등으로 끝남.
그러나 공격자가 파일 확장자를 수정할 수 있음. -> 파일 시그니처를 통해 파일 유형 구분 가능.
파일 시그니처(file signature) : 파일 헤더에 작성되는 바이트의 독특한 배열 순서.
*윈도우 실행 파일 또는 PE 파일 : 파일의 첫 바이트에 MZ 또는 헥사 문자 4D 5A라는 파일 시그니처를 가짐.
- 수작업 : 헥사 편집기(hex editor)로 파일을 열어 파일 시그니처를 찾는 방법. / 리눅스 xxd 명령어 사용.
- 파일 식별 도구 이용 : 리눅스 - file 유틸리티 이용. / 윈도우 - CFF Explorer 이용.
- 파이썬 : python-magic 모듈 이용.
악성코드 식별
식별하기(Fingerprinting)는 의심스러운 바이너리 내용을 바탕으로 암호 해시 값을 생성하는 활동을 포함.
*암호 해시 알고리즘 : MD5, SHA1, SHA256 등
암호 해시의 사용
- 파일명 기준 악성코드 식별의 경우, 동일한 악성코드 샘플이 다른 이름을 사용할 수 있음. 암호 해시는 파일 내용에 기반하기 때문에 이를 동일하게 식별.
- 악성코드 실행 시, 자신의 다른 위치에 복사하거나 다른 악성코드 드롭 가능. 해시 값은 이 같은 샘플이 원본 샘플과 동일한지 다른 악성코드인지 식별에 도움.
- 다른 보안 연구자들과 공유하는 식별자로 자주 사용.
- 다중 백신 스캐닝 서비스의 데이터베이스 검색. -> 이전에 탐지된 적 있는지 판단 가능.
암호 해시 생성
- 리눅스 : md5sum, sha256sum, sha1sum
- 윈도우 : HasyMyFiles 등
- 파이썬 : hashlib
다중 백신 스캐닝
의심스러운 바이너리를 다중 백신 스캐너로 스캔. -> 악성코드 시그니처가 존재하는지 확인 가능.
시그니처 이름을 통해 파일과 기능에 대한 추가 정보 획득 : 검색 엔진에 시그니처 검색. / 백신 벤더의 웹사이트 방문.
바이러스토털(virus total) : 웹 기반 악성코드 스캐닝 서비스.
백신 스캐너로 바이너리 스캐닝/바이너리 등록 시 주의 사항.
- 코드 수정/난독화 기술로 백신 탐지 우회 가능성. -> 백신 스캐닝 엔진에서 탐지되지 않았다고 안전한 것X.
- 등록한 바이너리는 서드파티와 벤더에 공유될 수 있음. 의심 바이너리에는 민감 정보가 포함될 수 있으므로, 기밀 조사 중인 바이너리는 백신 스캐닝 서비스에 등록X 권고. -> 바이너리 등록보다 암호 해시 검색.
- 스캔 결과가 데이터베이스에 저장. 스캔 결과 대부분은 공개적으로 조회 가능. -> 공격자가 검색해서 샘플 탐지 여부 확인 가능, 전략 변경이나 탐지 회피 가능성 존재.
문자열 추출
문자열(string) : 파일에 포함된 출력 가능한 ASCII와 유니코드의 순차적인 문자 집합.
바이너리에서 추출하는 문자열은 파일명, URL, 도메인명, IP 주소, 공격 명령어 레지스트리 키 등을 포함할 수 있음.
문자열 추출 도구
- 리눅스 : strings 유틸리티 사용. ASCII와 유니코드 문자열 모두 추출하려면 -el 옵션 사용.
- 윈도우 : pestudio
탐지 회피를 위해 간단한 문자열 난독화(simple string obfuscation) 기법 사용. -> 문자열 추출 도구로 추출할 수 X.
FLOSS(FireEye Labs Obfuscated Tring Solver) : 난독화된 문자열 자동으로 추출, 식별하기 위한 도구.
윈도우 및 리눅스용 FLOSS : https://github.com/mandiant/flare-floss
파일 난독화 파악
악성코드 제작자는 보안 제품의 탐지를 회피하고 분석을 방해하기 위해, 패커와 크립터 같은 프로그램을 사용.
- 패커(Packer) : 실행 파일을 입력으로 받아, 실행 파일의 내용을 압축해 난독화하는 프로그램.
난독화한 콘텐츠 -> 새로운 파일의 구조체에 저장. 디스크에 난독화된 콘텐츠를 담고 있는 실행 파일이 결과물로 생김. 해당 프로그램 실행 시, 압축해제 루틴이 실행되고 메모리에 원본 바이너리 추출 후 실행. - 크립터(Cryptor) : 실행 파일의 내용을 난독화하기 위해 암호화를 사용하는 프로그램.
암호화한 내용 -> 새로운 실행 파일에 저장. 실행 시, 복호화 루틴을 실행해 원본 바이너리를 메모리에 추출 후 실행.
파일 난독화 탐지 : 패킹한 샘플 발견. -> 악성코드일 확률이 높음.
윈도우 패커 탐지 도구 : Exeinfo PE
PE 헤더 정보 조사
PE 파일 포맷 : 윈도우 실행 파일(.exe / .dll / .sys / .ocx / drv)이 사용. 그런 파일을 PE(Portable Excutable)이라 부름.
PE 파일 : 운영 시스템이 메모리로 로딩할 때 필요한 정보를 가진 일련의 구조체와 하위 컴포넌트.
바이너리 실행 시 PE 헤더에서 구조체 정보를 읽은 후, 바이너리 내용을 파일에서 읽어 메모리로 로딩.
*PE 헤더 : 실행 파일이 메모리 어디에 로딩돼야 할지, 실행 파일 시작 위치, 애플리케이션이 의존하는 라이브러리/함수 목록, 바이너리가 사용하는 리소스 등의 정보를 포함.
악성코드는 파일, 레지스트리, 네트워크 등과 상호작용. -> 악성코드는 운영 시스템에서 제공하는 함수를 많이 의존. -> 악성코드가 의존하는 DLL 및 DLL이 의존하는 API 함수 조사 시, 악성코드의 기능/성능 등을 알 수 있음.
+임포트가 거의 없는 경우, 패킹한 바이너리란 사실을 알 수 있음. -> 임포트는 또한 난독화 여부 탐지에 도움을 줌.
윈도우 : API라 불리는 함수를 임포트, 상호작용을 위해 DLL이 필요.
pestudio
- imports : DLL에서 임포트한 API 함수 표시.
- blacklist 열 : 악성코드가 자주 사용하는 API 함수 강조.
파이썬 : 에로 카레라(Ero Carerra)의 pefile 모듈. 이를 통해 DLL 파일과 임포트한 함수 나열.
*임포트 함수 : 실행 파일이 다른 파일로부터 임포트한 함수.
DLL은 다른 프로그램에서 사용할 수 있는 함수를 익스포트 할 수 있음. -> 공격자는 악의적인 함수를 익스포트하는 DLL을 자주 생성.
익스포트 함수 조사 시, DLL 기능 빠르게 이해 가능.
- pestudio에서 exports 확인.
- 파이썬 : pefile 모듈 사용. 익스포트 함수 나열.
PE 파일의 실제 내용은 섹션으로 구분, 섹션은 PE 헤더 바로 다음에 존재.
*섹션(section) : 코드 또는 데이터를 나타냄. 읽기/쓰기와 같은 메모리 내부 속성을 가짐.
- 코드를 나타내는 섹션 : 프로세스가 실행할 명령어를 포함.
-.text 또는 CODE : 실행 코드를 포함. - 데이터를 포함한 섹션 : 읽기/쓰기 프로그램 데이터, 임포트/익스포트 테이블, 리소스 등 다양한 유형의 데이터를 나타낼 수 있음.
-.data 또는 DATA
-.rdata : 읽기/쓰기 데이터와 전역변수 포함.
-.idata : 읽기 전용 데이터 포함. 임포트/익스포트 정보를 포함하기도.
-.edata : 임포트 테이블 포함. 존재하지 않는다면 임포트 정보는 .rdata 섹션에 저장.
-.rsrc : 실행 파일에서 사용하는 아이콘, 대화창, 메뉴, 문자열 등의 리소스 포함.
섹션 테이블 검사. -> PE 파일의 이상을 식별하는데 도움.
*섹션 테이블(section table) : 섹션에 대한 정보가 존재. PE 헤더에 있음.
필드 | 설명 |
이름 | 섹션명을 표시. 실행 파일은 네 가지 섹션(.text / .data / .rdata / .rsrc) 포함. |
가상-크기 | 메모리에 로딩할 때 섹션의 크기를 나타냄. |
가상-주소 | 섹션을 메모리 어디에서 찾을 수 있는지 나타내는 상대적 가상 주소. |
원시-크기 | 해당 섹션이 디스크에 존재할 때의 크기를 나타냄. |
원시-데이터 | 파일에서 해당 섹션을 찾을 수 있는 오프셋을 나타냄. |
엔트리 포인트 | 코드가 실행을 시작하는 RVA(Relative virtual address, 상대적 가상 주소) |
pestudio에서 sections : 섹션 테이블에서 추출한 섹션 정보와 그 속성을 표시.
파이썬 스크립트 pefile 모듈 사용 : 섹션과 섹션의 특징 보여줌.
PE 헤더는 바이너리가 컴파일될 때 생성되는 정보 포함. -> 악성코드가 언제 처음 생성됐는지 알 수 있음.
공격자가 타임스탬프(timestamp)를 수정해 분석 방해 가능성 존재. 실제 컴파일 타임스탬프를 몰라도, 비정상적 행위 식별에 도움.
- pestudio file-header에서 stamp 확인.
- 파이썬 pefile 모듈 명령어로 컴파일 타임스탬프 파악.
실행 파일에 필요한 리소스 : 실행 파일의 리소스 섹션(.rsrc)에 저장. -> 공격자가 추가 바이너리, 미끼 문서, 설정 데이터와 같은 정보를 리소스 섹션에 저장하기도.
리소스 해커(Resource Hacker) : 의심 바이너리에서 리소스 조사하고 확인 후, 추출 가능한 도구.
악성코드 비교와 분류
의심 바이너리를 이전 분석 샘플 또는 공개, 사설 저장소에 저장된 샘플과 비교. -> 악성코드군, 악성코드의 특징, 이전 분석 샘플과의 유사성을 파악할 수 있음.
퍼지 해싱(fuzzy hashing) : 파일 유사도를 비교하는 좋은 방법.
- ssdeep : 퍼지 해시를 생성하는 데 좋은 도구. 샘플 간의 유사성 비율 파악, 유사한 샘플 식별에 유용.
- -p 옵션 : 유사도를 알 수 있음.
- -r 옵션 : 재귀 모드, 디렉터리와 악성코드 샘플을 포함한 하위 디렉터리에서 ssdeep 실행 가능.
- 파이썬 : python-ssdeep
임포트 해시(import hash=imphash) : 실행 파일에 있는 라이브러리/임포트 함수(API)명과 특유의 순서를 바탕으로, 해시 값을 계산하는 기술.
동일한 소스와 동일한 방식으로 파일을 컴파일 시, 동일한 imphash 값을 갖는 경향. -> 동일한 imphash 값을 갖는 샘플 발견 시, 관련이 있을 수 있음을 의미.
pestudio에서 파일 로드하면 imphash 생성.
파이썬 pefile 모듈 : imphash 생성. 샘플을 입력받아 imphash 계산
섹션 해싱(section hashing) : 임포트 해시와 유사하게, 관련 샘플 식별에 도움.
pestudio에서 파일 로드하면 각 섹션(.text / .data / .rdata 등)의 MD5 계산. -> section에서 확인.
파이썬 pefile 모듈 : 섹션 해시 구할 수 있음.
악성코드 샘플은 많은 문자열 또는 바이너리 구분자 포함할 수 있음. 바이너리에 나타나는 고유 문자열과 바이너리 구분자를 기준으로 악성코드 분류.
YARA : 악성코드를 식별하고 분류하는 도구. 텍스트 또는 바이너리 정보를 기반해 YARA 규칙 생성 가능.
*YARA 규칙 : 로직을 결정하는 문자열과 부울 표현식의 집합으로 구성.
-> 해당 규칙은 YARA 유틸리티 / yara-python을 사용해 작성한 도구로 파일을 스캐닝할 때 해당 규칙 이용 가능.
YARA 규칙
- 규칙 식별자(rule identifier) : 규칙을 설명하는 이름.
- 문자열 정의(string definition) : 규칙의 일부인 문자열이 정의되는 섹션. 생략 가능. 각 문자열은 연속된 영문자, 숫자, 밑줄이 뒤따르는 $ 문자로 구성된 식별자를 가짐. 예시로, $a/$b/$c는 값을 포함하는 변수라 생각하면 됨.
- 조건 섹션(condition section) : 선택 섹션이 아님. 규칙의 로직이 위치하는 곳. 부울 표현식을 포함해야 함.
'보안 > 악성코드' 카테고리의 다른 글
[3장]동적 분석 (0) | 2025.04.08 |
---|---|
[논문]"머신러닝 기반 악성 URL 탐지 기법" 정리 (0) | 2025.04.01 |
[1장]악성코드 분석 소개 (0) | 2025.03.25 |