: 프로그램의 기능을 파악하기 위해 코드나 프로그램의 구조를 분석하는 과정, 악성 코드 연구의 시작 단계
→ 악성 여부를 판단하는 안티바이러스 도구 사용
→ 악성 코드 판별하는 해시 사용
→ 파일의 문자열, 함수, 헤더에서 개략적인 정보 수집
: 의심 파일을 찾기 위해 file signatures(의심 파일 식별자)로 이뤄진 데이터베이스, 행위와 패턴 매칭 분석
! 악성 코드 제작자가 file signatures를 바꾸면 우회 가능
! 대중적이지 않은 악성 코드 탐지 불가
! heuristic(경험적 기법) 우회 가능
ex) VirusTotal 사이트
※ 해시 프로그램 : 악성 코드를 식별하는 고유 해시 생성
ex)md5deep
ex) SHA-1(Secure Hash Algorithm 1), MD5(Message-Digest Algorithm 5)
해시값 획득 > 이름으로 사용
> 악성 코드 식별 위해 다른 분석가와 공유
> 이미 식별된 파일인 지를 온라인에서 검색
: 프로그램 기능에 대한 정보가 문자열에 담겨 있음 cf) ASCII : 문자열+NULL UNICODE : 문자+NULL+문자+NULL+문자+NULL+...
: 파일 압축, 정적 분석 시 wrapper 프로그램만 분석 가능
> 패커 탐지 프로그램 : PEiD(경고 없이 악성 실행 파일을 실행하기 때문에 악성 코드 분석가 시스템 공격 가능), ExEinfo PE
> UPX 언패킹 프로그램 : UPX
: 윈도우 OS 로더가 래핑한 실행 코드를 관리할 수 있는 필수 정보를 담은 데이터 구조 : 코드에 관한 정보, 애플리케이션 유형, 필요한 라이브러리와 함수, 메모리 공간 요구 사항을 포함한 헤더로 시작
> 윈도우 실행 파일, 객체 코드, DLL이 사용
cf) PE 포맷 뷰어 : PEview, HxD
> 윈도우 실행 PE 파일 영역:
> PE 헤더
>> IMAGE_DOS_HEADER, MS-DOS Stub : 주요 정보 x
>> IMAGE_NT_HEADERS : Signature - 항상 동일
: IMAGE_FILE_HEADER - 파일에 대한 기본 정보
cf) 컴파일 시간이 오래 됐다면 예전 공격(안티바이러스 프로그램이 시그니처 보유), 컴파일 시간이 이상하다면 악성 코드 제작자의 조작 가능성
>> IMAGE_OPTIONAL_HEADER : Subsystem - 실행 파일이 콘솔 or GUI 프로그램 (or Native or Xbox) 여부
- 콘솔 : IMAGE_SUBSYSTEM_WINDOWS_CUI
- GUI : IMAGE_SUBSYSTEM_WINDOWS_GUI
>> IMAGE_SECTION_HEADER : 프로세스 로딩 중 섹션에 할당한 공강인 Virtual Address(가상 공간)과 섹션이 디스크에서 차지하는 공간인 Size of Raw Data(원래 데이터 크기)가 크게 다를 경우 패킹 가능성
cf) Resource Hacker : 리소스 섹션 탐색기
cf) PEBrowse Professional, PE Explorer : PE 헤더 탐색기
> PE 헤더 요약:
※ import 함수 : 실제 다른 프로그램에 저장돼 있지만 외부 프로그램에 링크하여 사용할 수 있게 한 함수
ex) 많은 프로그램에서 일반적인 기능을 담고 있는 코드 라이브러리
> Static Link(정적 링크) : 실행 파일로 라이브러리의 모든 코드 복사, 실행 파일 크기 증가
: 유닉스와 리눅스 프로그램에서 일반적, 라이브러리 링크 방식에서 가장 적게 사용
! 링크 코드 존재 여부 인지하는 정보 x, 정적으로 연결된 코드와 실행 파일 자체 코드 분간 어려움
> Runtime Link(런타임/실행 시간 링크) : 함수가 필요할 때만 라이브러리에 연결
: 일반적인 프로그램에서 자주 사용 x, 악성코드 패킹이나 난독화 시 자주 사용
cf) LoadLibrary, GetProcAddress, (LdrGetProcAddress, LdrLoadDll) : 프로그램의 파일 헤더에 명시되지 않았음에도 import할 수 있게 허용한 링크 함수, 프로그램에서 시스템 내의 라이브러리와 함수를 모두 호출 가능 → 의심스러운 프로그램이 어떤 함수를 연결했는 지 알 수 없음
> Dynamic Link(동적 링크) : 호스트 운영체제가 프로그램을 로드할 때 필요한 라이브러리르 검색하고, 프로그램이 링크된 라이브러리 함수를 호출하면 라이브러리 내의 함수 실행
: 악성 코드 분석가가 가장 흔하게 사용
cf) 동적 링크 함수 탐색기 : Dependency Walker
cf) 공통 DLL을 이용해 어플리케이션이 할 수 있는 작업:
cf) 함수명 관례 : ~EX(이전 함수 업데이트), ~A(ASCII 문자열), ~W(Wide character Strings 문자열)
> Export 함수 : DLL에 주로 보임, EXE에서는 악성 코드에서 서비스를 제공하는 척 export하여 동작하려 하기도 함
> Kernel32.dll : 프로세스 생성 및 조작(OpenProcess, GetCurrentProcess, GetProcessHeap), 디렉토리를 통한 검색(FindFirstFile, FindNextFile)
> User32.dll : GUI 조작(RegisterClassEx, SetWindowText, ShowWindow), 키로거 및 스파이웨어(SetWindowsHook), 단축키 조합 누를 시 어플리케이션 동작(RegisterHotKey)
> GDI32.dll : GUI를 가진 프로그램
> Shell32.dll : 다른 프로그램 실행 가능한 프로그램
> Advapi32.dll : 레지스트리 사용, 윈도우 부팅 시 자동으로 실행되게 제어하는 레지스트리키(Software\Microsoft\Windows\CurrentVersion\Run 문자열)
> LowLevelKeyboardProc, LowLevelMouseProc : SetWindowsHookEx 함수를 이용해 특정 이벤트 발생 시 어떤 함수 호출할 지 결졍되는 함수
> 가상머신 : VMware, Parallels, Microsoft Virtual PC, Microsoft Hyper-V, Xen
※ 인터넷 네트워크 분석 : Bridged Network Adapter - 물리 머신과 동일한 네트워크 인터페이스에 연결
: NAT(Network Address Translation) - 호스트의 인터넷 접속 IP 사용
∵ 호스트가 무선 어댑터를 사용했을 때 무선 네트워크가 WPA(Wi-Fi Protected Access), WEP(Wired Equivalent Privacy)를 사용하더라도 가능
∵ 호스트 어댑터가 특정 네트워크 어댑터에 대해서만 연결을 허용하더라도 가능
: 네트워크 분리(가상머신에서 네트워크 어댑터 삭제 혹은 VM>Removable Devices에서 네트워크 어댑터 삭제), Host-Only(호스트 운영체제와 게스트 운영 체제 사이의 분리된 사설 LAN 생성 기능), 여러 가상머신 이용(서비스용 가상 머신 만들어 VMNet 가상 스위치로 연결)
: 스냅샷, 녹화/재생을 이용하여 악성 코드 감염 전과 후 상태를 번갈아가며 분석
: 악성 코드 실행 시점 모니터링, 악성 코드 수행 이후 시스템 변화 분석
: 악성 코드 실행 후 수행, 난독화나 패킹됐을 경우나 정적 분석 기법으로 한계 도달 시 두 번째 단계로서 수행
! 네트워크와 시스템 감염 위험이 있기 때문에 기초 정적 분석 완료 후 수행해야 함
: 실제 시스템의 감염 부담 없이 네트워크 서비스까지 시뮬레이션하여 악성 코드 실행할 수 있는 보안 매커니즘
ex) Norman SandBox, GFI SandBox, Anubis, Joe SandBox, ThreatExpert, BitBlaze, Comodo Instant Malware Analysis
> 섹션 종류
- 분석 요약 섹션(Analysis Summary section) : 정적 분석 정보, 상위 수준의 동적 분석 결과
- 파일 섹션(File Activity section) : 악성 코드가 영향을 끼친 프로세스마다의 오픈, 생성, 삭제된 파일
- 생성한 뮤텍스 섹션(Created Mutexes section) : 악성 코드가 생성한 뮤텍스
- 레지스트리 행위 섹션(Registry Activity section) : 레지스트리 변경 사항
- 네트워크 행위 섹션(Network Activity section) : 악성 코드가 설정한 리스닝 포트나 DNS 요청 등 악성 코드로 인한 네트워크 행위
- VirusTotal 결과 섹션(VirusTotal Results section) : 악성 코드의 VirusTotal 스캔 결과
> 발생 가능한 단점
- 가상 머신에서 동작한다는 사실 탐지할 경우의 실행 방식 변경이나 멈춤 고려 x
- 발견되지 않는 특정 레지스트리 키나 파일 등
- DLL 형태여서 특정 Export 함수가 비정상 작동하거나 실행 파일처럼 동작하지 않을 수 있음
- OS 부적합성
- 악성 코드 행위는 알려주지 않음
> Command Line
C:\>rundll32.exe DLLname, Export arguments
C:\>rundll32.exe DLLname, #Ordinal
> PE 헤더 변조
IMAGE_FILE_HEADER 내의 Characteristics 필드의 IMAGE_FILE_DLL 플래그 삭제(Import 함수 동작 및 악성 코드 정지 가능)
> 서비스 설치
C:\>rundll32 ipr32x.dll, InstallService ServiceName
C:\>net start ServiceName
→ 서비스 항목은 레지스트리의 HKLM\SYSTEM\CurrentControlSet\Services에 위치
: 특정 레지스트리, 파일 시스템, 네트워크, 프로세스와 스레드 행위를 모니터링할 수 있는 고급 윈도우 감시 도구
: FileMon+RegMon
! 특정 GUI 호출(ex. SetWindowsHookEx)이나 장치 I/O 제어를 통한 루트컷, 대화하는 사용자 모드 컴포넌트의 장치 드라이버 행위는 수집하지 x
! 윈도우 버전에 따라 일관성 있게 동작 x → 네트워크 행위 로깅하는 용도로 사용 불가
! 모든 시스템 호출을 감시하기 때문에 다운되지 않도록 특정 시간 동안만 실행하도록 설정해야 함(File>Capture Events)
: 분석 전 관련 없는 데이터 제거(Edit>Clear Display)
> 기능
: 이벤트의 시퀀스 번호, 타임스탬프, 이벤트의 원인이 되는 프로세스명, 이벤트 Operation, 이벤트 사용 경로, 이벤트 결과를 포함한 개별 이벤트에 대한 정보를 가진 설정 가능한 칼럼
> 필터링
: Filter>Filter → 칼럼 우선 설정 & Reset → 필터(ProcessName,Operation,Detail 등) → 비교 연산자(Is,Contatins,Less Than 등) → Include/Exclude
: ProcMon.exe나 pagefile 등 로깅에서 미리 제외하는 필터 존재
: 자동 필터
- Registry : 레지스트리 동작을 검사해 레지스트리 내에 악성 코드 흔적이 어떻게 남는 지
- File system : 파일 시스템을 탐색해 악성 코드가 생성한 파일이나 설정에 사용한 파일
- Process activity : 프로세스 행위를 검사해 또 다른 프로세스를 생성했는 지
- Network : 네트워크 연결을 통해 악성 코드가 리스닝하는 포트
: Process(프로세스명), PID(프로세스 식별자), CPU(CPU 사용량), 설명(Description), 회사명(Company Name)
: 서비스(분홍색), 프로세스(파란색), 새로운 프로세스(녹색_일시적), 종료된 프로세스(빨간색_일시적)
: DLL 표시 윈도우를 핸들 윈도우로 전환 시 파일 핸들, 뮤텍스, 이벤트 등 프로세스가 생성한 모든 핸들 볼 수 있음
: 속성 윈도우
- Threads 탭 : 모든 활성화된 스레드
- TCP/IP 탭 : 프로세스가 리스닝하고 있는 활성화된 연결이나 포트
- Image 탭 : 실행 파일의 디스크 경로
cf) 악의적인 문서(ex. PDF, Word) 분석 가능
: 디스크상의 이미지가 마이크로소프트에서 서명한 바이너리인 지 검증 → 아닐 시 악성 코드 은닉 가능성
! 메모리 상의 이미지 검증 x → 공격자가 프로세스 교체(Process Replacement) 기법(시스템 프로세스 실행에 관여해서 악의적인 실행 파일로 프로세스의 메모리 공간을 덮어쓰는 방법_검증되지만 메모리 상에서와 디스크 상에서의 이미지가 다름) 사용 시 쓸모 x
: 속성 윈도우의 Strings 탭에서 디스크 실행 파일 내에서와 메모리에서의 문자열이 상당수 상이할 경우 악성 코드
: 프로세스명>Launch Depends 혹은 Find>Find Handle로 depends.exe(Dependency Walker)
: 디스크 상에서 악의적인 DLL을 검색해 DLL을 사용하는 프로세스를 알고할 할 때 유용
: 로딩 시간 이후 DLL이 프로세스를 로드했는 지 Dependency Walker의 Export 함수와 프로세스 익스플로러의 DLL 항목 비교
※ Regshot : 두 레지스트리 스냅샷을 찍고 비교하는 오픈소스 레지스트리 비교 도구
: 1st Shot>2nd Shot>Compare
cf) 시드 값은 일반적이므로 신경쓰지 않아도 됨
: 가짜 네트워크를 생성해 인터넷 실접속 없이 네트워크 행위를 알아내는 Indicator(행위 표시자)가 DNS 이름, IP 주소, 패킷 시그니처를
ㅣ,알려줌
> ApateDNS
: 악성코드의 DNS 요청을 볼 수 있는 도구
: 로컬 장비의 UDP 포트 53번을 리스닝해 지정된 IP 주소에 대해 가짜 DNS 응답을 보낸 후 수신한 요청 패킷의 Hex와 ASCII 결과 출력
: IP 설정>인터페이스 선택>Start Server
: NXDOMAIN 옵션으로 악성 코드의 추가 도메인 찾을 수 있음
> Netcat
: 포트 스캐닝, 터널링, 프락시, 포트 포워딩 등의 용도, Inbound&Outbound 연결 모두에 사용 가능
: 리스닝 모드에서 서버로, 연결 모드에서 클라이언트로 동작, 표준 입출력
: 내부 내트워크, 네트워크 사용량 분석, 어플리케이션 디버그 문제점, 동작한느 프로토콜 연구, 패스워드 스니핑, 네트워크 프로토콜 리버싱, 주요 정보 후킹, 공공 와이파이로 온라인 채팅 엿보기 등의 활용 가능
: 일반적인 인터넷 서비스를 제공하는 리눅스 기반의 소프트웨어 모음
: HTTP, HTTPS, FTP, IRC, DNS, SMTP 등의 서비스 emulation하여 실제 서버와 유사하게 동작
: 들어오는 요청과 연결 기록 → 악성 코드가 표준 서비스에 연결돼있는 지 제작 중인 요청을 살표보는 지 결정하는 데에 유용
: 요청 이후 반환되는 페이지나 아이템 미리 제공, 다양한 서비스를 리스닝하고 있는 포트 번호 수정 가능, 포트에 관계없이 클라이언트에서 오는 모든 데이터를 로깅할 수 있는 기능인 더미 서비스 제공
015 악성 코드 분석 입문 (0) | 2020.09.28 |
---|---|
014 Debugger (0) | 2020.09.27 |
013 API Hooking (0) | 2020.09.26 |
012 DLL Injection (0) | 2020.09.26 |
011 Anti Debugging (0) | 2020.09.25 |