문자열과 16진수로 헌팅하기
악성 코드 흔적을 찾아 일치시킵니다.
문자열과 16진수로 헌팅하기은(는) CoddyKit의 무료 Cyber Security Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cyber Security Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cyber Security Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
샘플에서 규칙으로
탐색은 샘플에서 시작합니다. 식별력이 높은 아티팩트를 추출하고, 어떤 것이 오래 유지될지 판단한 다음, 정상 파일을 잘못 표시하지 않으면서 해당 패밀리를 탐지하는 규칙으로 작성합니다.
작업 흐름은 샘플을 분류하고, 문자열과 구조적 특성을 추출하고, 신호와 잡음을 분리하고, 규칙 초안을 작성한 다음, 배포 전에 패밀리와 정상 코퍼스 모두를 대상으로 테스트하는 것입니다.
후보 문자열 추출
strings 유틸리티로 시작하여 인쇄 가능한 시퀀스를 나열하고 ASCII와 UTF-16(와이드) 텍스트를 모두 수집하십시오. 윈도우 악성 코드는 문자열을 와이드 형식으로 저장하는 경우가 많습니다.
출력에서 C2 주소, 뮤텍스 이름, 레지스트리 경로, 사용자 정의 오류 메시지, PDB 경로, 지나치게 특이한 문자열을 찾으십시오. 일반적인 런타임 및 컴파일러 문자열은 무시하십시오.
strings -a sample.bin > ascii.txt
strings -e l sample.bin > wide.txt # UTF-16LE
grep -iE 'http|mutex|\\\\pipe\\\\|\.pdb' ascii.txt wide.txt변경하기 어려운 문자열 선택
모든 문자열을 규칙에 넣어야 하는 것은 아닙니다. 작성자가 상당한 노력을 들이지 않고는 바꾸기 어려운 아티팩트를 우선하십시오.
- 패밀리에 고유한 하드코딩된 뮤텍스 또는 파이프 이름
- 사용자 정의 프로토콜 표지 또는 구성 키
- 특이한 디버그 또는 패닉 메시지
- 빌드 환경을 드러내는 내장 PDB 경로
라이브러리 상용구, 흔한 API 이름, 정상 소프트웨어와 공유되는 버전 문자열은 오탐을 일으키므로 피하십시오.
strings:
$mutex = "Global\\Zx7yQ_lock" wide
$cfgkey = "x0r_cfg_begin" ascii
$pdb = "C:\\build\\loader\\release\\loader.pdb"단순 난독화 무력화
많은 패밀리는 문자열을 XOR하거나 다른 방식으로 가볍게 인코딩합니다. 평문 문자열이 드물다면 인코딩된 형태나 디코더 루틴을 찾으십시오.
알려진 평문의 XOR 인코딩 바이트를 계산하여 일치시킬 수도 있고, YARA의 xor 수정자를 사용하여 모든 단일 바이트 XOR 키에 해당하는 문자열을 자동으로 일치시킬 수도 있습니다.
strings:
// matches "http://" under any single-byte XOR key
$u = "http://" xor
// or a fixed key range
$k = "config" xor(0x01-0xff)16진수 패턴으로 탐색
문자열은 난독화되었지만 코드가 그렇지 않다면 악성 코드 자체의 논리에서 얻은 바이트 패턴을 일치시키십시오. 예를 들어 복호화 스텁, 언패킹 루프 또는 고유한 상수가 있습니다.
샘플을 디스어셈블하고 식별력이 높은 명령어 시퀀스를 찾은 다음, 연산 코드를 16진수 문자열로 변환하십시오. 재컴파일해도 패턴이 유지되도록 달라질 수 있는 바이트(주소, 즉시값)는 와일드카드로 처리하십시오.
strings:
// XOR decrypt loop with wildcarded counter/address
$decrypt = { 8A ?? 34 ?? 88 ?? 4? 4? 75 ?? }와일드카드와 점프 활용
16진수 탐색의 핵심은 어떤 부분을 와일드카드로 처리할지 선택하는 것입니다. 너무 엄격하면 재컴파일 시 규칙이 깨지고, 너무 느슨하면 모든 항목과 일치합니다.
- 컴파일러가 변경하는 상대 오프셋과 즉시값은 와일드카드로 처리하십시오.
- 알고리즘은 안정적이므로 연산 코드는 고정하십시오.
- 명령어 길이가 달라지는 곳에는 점프
[n-m]를 사용하십시오.
패턴은 고유성을 확보할 만큼 충분히 길게(대개 의미 있는 바이트 8개 이상) 만들되, 필요한 부분은 유연하게 유지하십시오.
strings:
$stub = { 55 8B EC 83 EC [1-4] E8 ?? ?? ?? ?? 33 C0 }구조 및 PE 지표
원시 바이트 이외의 정적 특성은 강력하고 오탐이 적은 조건을 만드는 데 도움이 됩니다. pe 모듈을 사용하면 다음을 기준으로 일치시킬 수 있습니다.
- imphash — 가져오기 테이블의 해시로, 패밀리의 빌드 간에 안정적인 경우가 많음
- 섹션 이름 — 사용자 정의 패커는 눈에 띄는 섹션을 추가함
- 특정 imports — VirtualAllocEx + WriteProcessMemory + CreateRemoteThread는 주입을 나타냄
import "pe"
condition:
pe.imphash() == "4e3a9f..." or
for any s in pe.sections : ( s.name == ".x0rsec" )신호로서의 엔트로피
패킹되거나 암호화된 영역은 높은 entropy를 가집니다. math 모듈은 이를 측정하므로, 페이로드 섹션이 암호화된 것처럼 보이는 샘플을 표시할 수 있습니다. 이는 패커의 특징입니다.
entropy만으로는 오탐이 많습니다(압축된 설치 프로그램도 entropy가 높음). 따라서 entropy만으로 경고하지 말고 다른 지표와 결합하십시오.
import "math"
condition:
math.entropy(0, filesize) >= 7.2 and $loader_stub지표 결합
가장 강력한 규칙은 여러 독립적인 지표를 요구하므로 단일한 우연의 일치만으로 탐지되지 않습니다. 문자열, 코드 패턴, 구조적 특성을 조합하십시오.
이 계층형 조건은 모든 부분이 일치해야 하므로 오탐에 강하고, 작성자가 여러 특성을 한꺼번에 변경해야 하므로 회피에도 강합니다.
condition:
uint16(0) == 0x5A4D and
filesize < 800KB and
$mutex and
$decrypt and
pe.imports("kernel32.dll", "CreateRemoteThread")이름 지정, 메타데이터 및 버전 관리
탐색 규칙은 다른 사람이 신뢰하고 유지 관리할 수 있을 때만 유용합니다. 각 규칙에 명확하고 네임스페이스가 지정된 이름을 부여하고 완전한 meta를 작성하십시오.
- 규칙을 작성하는 데 사용한 샘플 해시를 기록하십시오.
- 패밀리, 작성자, 날짜, 참조를 기록하십시오.
- 논리를 개선할 때 버전 필드를 올리십시오.
몇 달 후 규칙이 작동하더라도 이 메타데이터를 통해 대응 담당자는 규칙의 의미와 신뢰할 수 있는 정도를 파악할 수 있습니다. 이를 통해 일회성 탐색을 오래 유지되고 공유 가능한 탐지로 발전시킬 수 있습니다.
meta:
family = "X0rLoader"
author = "ir-team"
date = "2026-06-04"
hash = "9f1c...e2"
version = "2"신뢰하기 전에 테스트
새 규칙은 항상 두 코퍼스를 대상으로 검증하십시오.
- 참 양성 — 알려진 해당 패밀리의 모든 샘플이 일치해야 함
- 정상 파일 — 대규모 정상 집합(시스템 바이너리, 일반적인 앱)과 반드시 NOT 일치해야 함
윈도우 DLL에서 단 한 번의 오탐만 발생해도 전체 환경의 중요 파일이 격리될 수 있습니다. 실행하고, 개수를 세고, 누락과 탐지 결과를 검토한 뒤, 광범위하게 배포하기 전에 개선하십시오.
yara -r family.yar /malware_corpus/ # expect all to hit
yara -r family.yar /clean_corpus/ # expect zero hits빠른 확인
가장 회복력이 높은 지표를 선택하십시오.
복습
YARA 실전 탐색 전체 과정:
- ASCII와 와이드 문자열을 추출하고, 변경하기 어려운 아티팩트(뮤텍스, 구성 키, PDB 경로)를 유지함
- XOR 수정자 또는 인코딩된 패턴으로 가벼운 난독화를 무력화함
- 문자열이 숨겨져 있을 때 코드 바이트 패턴(복호화/언패킹 스텁)을 일치시킴
- 변하기 쉬운 바이트는 와일드카드로 처리하고, 연산 코드는 고정하며, 가변 길이에는 점프를 사용함
- PE imphash, 섹션, imports 및 entropy를 구조적 신호로 사용함
- 오탐과 회피에 강하도록 여러 지표를 결합함
- 배포하기 전에 항상 패밀리와 정상 파일 코퍼스를 대상으로 테스트함
다음: 전체 환경에서 이러한 규칙 실행하기
AI 튜터와 함께 Cyber Security Academy을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 76
- 레슨
- 303
자주 묻는 질문
“문자열과 16진수로 헌팅하기” 강의는 무료인가요?
네 — “문자열과 16진수로 헌팅하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cyber Security Academy 강의 전체를 잠금 해제할 수 있습니다. Cyber Security Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“문자열과 16진수로 헌팅하기”에서 뭘 배우나요?
악성 코드 흔적을 찾아 일치시킵니다. 브라우저에서 직접 실행하는 실습 코드로 Cyber Security Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cyber Security Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cyber Security Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“문자열과 16진수로 헌팅하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cyber Security Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cyber Security Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- YARA의 용도
- YARA 규칙 구문
- 문자열과 16진수로 헌팅하기
- 검색 확장 및 자동화