From 454e787559cbcc126c58586ac2a893e50a58fe99 Mon Sep 17 00:00:00 2001 From: Translator Date: Sun, 13 Jul 2025 02:49:36 +0000 Subject: [PATCH] Translated ['src/generic-methodologies-and-resources/basic-forensic-meth --- .../malware-analysis.md | 102 ++++++++++++++++-- 1 file changed, 92 insertions(+), 10 deletions(-) diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md index 59dc493c1..9afbec2ff 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/malware-analysis.md @@ -24,8 +24,8 @@ sudo apt-get install -y yara ``` #### 규칙 준비 -이 스크립트를 사용하여 github에서 모든 yara 악성코드 규칙을 다운로드하고 병합하세요: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ -_**rules**_ 디렉토리를 만들고 실행하세요. 그러면 악성코드에 대한 모든 yara 규칙이 포함된 _**malware_rules.yar**_라는 파일이 생성됩니다. +Use this script to download and merge all the yara malware rules from github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ +Create the _**rules**_ directory and execute it. This will create a file called _**malware_rules.yar**_ which contains all the yara rules for malware. ```bash wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py mkdir rules @@ -67,7 +67,7 @@ clamscan folderpath #Scan the whole folder ### IOCs -IOC는 침해 지표(Indicator Of Compromise)를 의미합니다. IOC는 잠재적으로 원치 않는 소프트웨어나 확인된 **악성코드**를 식별하는 **조건 집합**입니다. 블루 팀은 이러한 정의를 사용하여 **시스템**과 **네트워크**에서 이러한 종류의 악성 파일을 **검색**합니다.\ +IOC는 침해 지표(Indicator Of Compromise)를 의미합니다. IOC는 잠재적으로 원치 않는 소프트웨어나 확인된 **악성코드**를 식별하는 **조건의 집합**입니다. 블루 팀은 이러한 정의를 사용하여 **시스템**과 **네트워크**에서 이러한 종류의 악성 파일을 **검색**합니다.\ 이러한 정의를 공유하는 것은 매우 유용합니다. 컴퓨터에서 악성코드가 식별되고 해당 악성코드에 대한 IOC가 생성되면, 다른 블루 팀이 이를 사용하여 악성코드를 더 빠르게 식별할 수 있습니다. IOC를 생성하거나 수정하는 도구는 [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**입니다.**\ @@ -92,7 +92,7 @@ Compares process connection endpoints with C2 IOCs (new since version v.10) ``` ### Linux Malware Detect -[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/)는 공유 호스팅 환경에서 직면하는 위협을 중심으로 설계된 GNU GPLv2 라이센스 하에 출시된 리눅스용 악성코드 스캐너입니다. 이 도구는 네트워크 엣지 침입 탐지 시스템의 위협 데이터를 사용하여 공격에 적극적으로 사용되는 악성코드를 추출하고 탐지를 위한 서명을 생성합니다. 또한, 위협 데이터는 LMD 체크아웃 기능과 악성코드 커뮤니티 리소스에서 사용자 제출을 통해 파생됩니다. +[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/)는 GNU GPLv2 라이센스 하에 출시된 리눅스용 악성코드 스캐너로, 공유 호스팅 환경에서 직면하는 위협을 중심으로 설계되었습니다. 이 도구는 네트워크 엣지 침입 탐지 시스템의 위협 데이터를 사용하여 공격에 적극적으로 사용되는 악성코드를 추출하고 탐지를 위한 서명을 생성합니다. 또한, 위협 데이터는 LMD 체크아웃 기능과 악성코드 커뮤니티 리소스에서 사용자 제출을 통해 파생됩니다. ### rkhunter @@ -106,7 +106,7 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk ### PEpper -[PEpper](https://github.com/Th3Hurrican3/PEpper)는 실행 파일 내의 일부 기본 사항(이진 데이터, 엔트로피, URL 및 IP, 일부 yara 규칙)을 확인합니다. +[PEpper](https://github.com/Th3Hurrican3/PEpper)는 실행 파일 내의 일부 기본 사항(바이너리 데이터, 엔트로피, URL 및 IP, 일부 yara 규칙)을 확인합니다. ### PEstudio @@ -114,7 +114,7 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk ### Detect It Easy(DiE) -[**DiE**](https://github.com/horsicq/Detect-It-Easy/)는 파일이 **암호화**되었는지 감지하고 **패커**를 찾는 도구입니다. +[**DiE**](https://github.com/horsicq/Detect-It-Easy/)는 파일이 **암호화**되어 있는지 감지하고 **패커**를 찾는 도구입니다. ### NeoPI @@ -126,7 +126,7 @@ sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--sk ### Apple Binary Signatures -일부 **악성코드 샘플**을 확인할 때는 항상 이진 파일의 **서명**을 확인해야 하며, 서명한 **개발자**가 이미 **악성코드**와 **관련**되어 있을 수 있습니다. +일부 **악성코드 샘플**을 확인할 때는 항상 바이너리의 **서명**을 확인해야 하며, 서명한 **개발자**가 이미 **악성코드**와 **관련**되어 있을 수 있습니다. ```bash #Get signer codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier" @@ -141,14 +141,96 @@ spctl --assess --verbose /Applications/Safari.app ### 파일 스태킹 -웹 서버의 **파일**이 포함된 폴더가 **마지막으로 업데이트된 날짜**를 알고 있다면, **웹 서버의 모든 파일**이 **생성 및 수정된 날짜**를 **확인**하고, **의심스러운** 날짜가 있다면 해당 파일을 확인하십시오. +웹 서버의 **파일**이 포함된 폴더가 **마지막으로 업데이트된 날짜**를 알고 있다면, **웹 서버의 모든 파일**이 **생성 및 수정된 날짜**를 **확인**하고, 어떤 날짜가 **의심스럽다면**, 해당 파일을 확인하세요. ### 기준선 -폴더의 파일이 **수정되지 않아야 하는 경우**, 폴더의 **원본 파일**의 **해시**를 계산하고 **현재** 파일과 **비교**할 수 있습니다. 수정된 것은 **의심스러운** 것으로 간주됩니다. +폴더의 파일이 **수정되지 않아야 한다면**, 폴더의 **원본 파일**의 **해시**를 계산하고 **현재** 파일과 **비교**할 수 있습니다. 수정된 것은 **의심스럽습니다**. ### 통계 분석 -정보가 로그에 저장될 때, 각 웹 서버의 파일이 얼마나 자주 접근되었는지와 같은 **통계를 확인**할 수 있으며, 웹 셸이 가장 많이 접근된 파일 중 하나일 수 있습니다. +정보가 로그에 저장될 때, 각 웹 서버의 파일이 얼마나 자주 접근되었는지와 같은 **통계를 확인**할 수 있습니다. 웹 셸이 가장 많이 접근될 수 있습니다. + +--- + +## 동적 제어 흐름 디오브스큐레이션 해제 (JMP/CALL RAX 디스패처) + +현대의 악성코드 패밀리는 제어 흐름 그래프 (CFG) 난독화를 심각하게 악용합니다: 직접적인 점프/호출 대신 런타임에 목적지를 계산하고 `jmp rax` 또는 `call rax`를 실행합니다. 작은 *디스패처* (일반적으로 아홉 개의 명령어)는 CPU의 `ZF`/`CF` 플래그에 따라 최종 대상을 설정하여 정적 CFG 복구를 완전히 방해합니다. + +이 기술은 SLOW#TEMPEST 로더에 의해 보여지며, IDAPython과 Unicorn CPU 에뮬레이터에만 의존하는 세 단계의 워크플로우로 무력화할 수 있습니다. + +### 1. 모든 간접 점프 / 호출 찾기 +```python +import idautils, idc + +for ea in idautils.FunctionItems(idc.here()): +mnem = idc.print_insn_mnem(ea) +if mnem in ("jmp", "call") and idc.print_operand(ea, 0) == "rax": +print(f"[+] Dispatcher found @ {ea:X}") +``` +### 2. 디스패처 바이트 코드 추출 +```python +import idc + +def get_dispatcher_start(jmp_ea, count=9): +s = jmp_ea +for _ in range(count): +s = idc.prev_head(s, 0) +return s + +start = get_dispatcher_start(jmp_ea) +size = jmp_ea + idc.get_item_size(jmp_ea) - start +code = idc.get_bytes(start, size) +open(f"{start:X}.bin", "wb").write(code) +``` +### 3. Unicorn으로 두 번 에뮬레이트하기 +```python +from unicorn import * +from unicorn.x86_const import * +import struct + +def run(code, zf=0, cf=0): +BASE = 0x1000 +mu = Uc(UC_ARCH_X86, UC_MODE_64) +mu.mem_map(BASE, 0x1000) +mu.mem_write(BASE, code) +mu.reg_write(UC_X86_REG_RFLAGS, (zf << 6) | cf) +mu.reg_write(UC_X86_REG_RAX, 0) +mu.emu_start(BASE, BASE+len(code)) +return mu.reg_read(UC_X86_REG_RAX) +``` +`run(code,0,0)` 및 `run(code,1,1)`을 실행하여 *false* 및 *true* 분기 대상을 얻습니다. + +### 4. 직접 점프 / 호출 패치하기 +```python +import struct, ida_bytes + +def patch_direct(ea, target, is_call=False): +op = 0xE8 if is_call else 0xE9 # CALL rel32 or JMP rel32 +disp = target - (ea + 5) & 0xFFFFFFFF +ida_bytes.patch_bytes(ea, bytes([op]) + struct.pack('