안녕하세요, 보안의 최전선에서 싸우는 분석가 여러분! 🛡️
악성코드 분석을 하다 보면 수천, 수만 개의 파일 중에서 "내가 찾던 그 놈"을 콕 집어내야 할 때가 있습니다. 일일이 열어볼 수도 없고, 기존 백신으로는 잡히지 않는 신종 악성코드라면 더더욱 막막하죠.
이때 필요한 것이 바로 YARA(야라)입니다. YARA는 "파일을 위한 정규표현식"이라고 불리며, 악성코드의 패턴(지문)을 정의하여 파일을 분류하는 가장 강력한 도구입니다.
오늘은 YARA 룰을 작성하기 위한 기초 문법 구조(3대 요소)와 작성 원칙을 완벽하게 파헤쳐 보겠습니다. 이 글만 읽으면 여러분도 나만의 백신 엔진을 만들 수 있습니다! 🚀

1. YARA 룰의 해부학: 뼈대 이해하기 🦴
YARA 룰은 C언어와 비슷한 직관적인 구조를 가지고 있습니다. 크게 헤더(Header), 메타(Meta), 문자열(Strings), 조건(Condition) 네 부분으로 나뉩니다.
rule Malware_Example_Rule // [헤더] 룰의 이름
{
meta: // [메타] 설명 및 정보
author = "Security Analyst"
description = "This is a sample rule"
date = "2025-12-16"
strings: // [문자열] 찾고자 하는 패턴
$text_string = "malicious_command"
$hex_string = { E2 34 A1 ?? 00 }
condition: // [조건] 탐지 논리
$text_string or $hex_string
}
각 섹션이 어떤 역할을 하는지 상세히 뜯어볼까요? 🧐
2. 첫 번째 요소: 메타 (Meta) - "명함" 📝
meta 섹션은 룰의 동작에는 전혀 영향을 주지 않습니다. 하지만 실무에서는 가장 중요할 수도 있습니다. 나중에 이 룰을 누가, 왜 만들었는지 기록해두는 '주석'이자 '명함'이기 때문입니다.
- 주요 키워드:
- author: 작성자 이름
- description: 룰에 대한 설명 (어떤 악성코드를 잡는지)
- date: 작성일 또는 수정일
- hash: 분석한 악성코드 샘플의 해시값 (매우 중요! 나중에 검증용으로 쓰임)
- version: 룰 버전
💡 작성 팁: 혼자 쓰는 룰이라도 description과 hash는 꼭 적는 습관을 들이세요. 3개월 뒤의 나를 위해서입니다.
3. 두 번째 요소: 문자열 (Strings) - "증거물" 🧵
strings 섹션은 파일 내부에서 '찾고 싶은 데이터'를 정의하는 곳입니다. 변수처럼 $ 기호로 시작하는 식별자를 사용합니다.
크게 세 가지 타입이 있습니다.
① 텍스트 문자열 (Text Strings)
일반적인 ASCII 문자나 유니코드 문자열을 찾습니다. 쌍따옴표(" ")를 사용합니다.
$s1 = "cmd.exe" ascii // 일반적인 영문 문자열
$s2 = "Attack" wide // 유니코드 문자열 (2바이트씩 저장됨)
$s3 = "Error" nocase // 대소문자 구분 안 함 (error, ERROR 모두 탐지)
$s4 = "hacker" fullword // 단어 전체가 일치할 때만 (yhacker 탐지 안 함)
② 헥사 문자열 (Hex Strings)
바이너리 코드(기계어)나 특정 바이트 패턴을 찾을 때 사용합니다. 중괄호({ })를 사용합니다.
$h1 = { E2 34 A1 C5 } // 정확히 일치하는 바이트
$h2 = { E2 34 ?? C5 } // 와일드카드(??): 저 자리에 뭐가 와도 상관없음
$h3 = { E2 [2-4] C5 } // 점프: 중간에 2~4 바이트가 건너뛰어짐
- 와일드카드(??)는 변종 악성코드를 잡을 때 핵심적인 역할을 합니다!
③ 정규표현식 (Regular Expressions)
복잡한 패턴을 찾을 때 사용하지만, 성능 저하의 주범이므로 꼭 필요한 경우에만 씁니다. 슬래시(/ /)를 사용합니다.
$r1 = /md5: [0-9a-fA-F]{32}/
4. 세 번째 요소: 조건 (Condition) - "판사" ⚖️
condition 섹션은 정의한 문자열들을 조합하여 "최종적으로 악성코드라고 판단할지 말지" 결정하는 논리 영역입니다. True가 반환되면 탐지된 것입니다.
① 논리 연산자 (Boolean Logic)
condition:
($s1 and $s2) or $h1 // s1과 s2가 모두 있거나, h1이 있으면 탐지
② 개수 기반 (Counting)
condition:
#s1 > 3 // 문자열 s1이 파일 내에 3번 넘게 등장하면 탐지
③ 파일 크기 및 헤더 검사 (File Properties)
가장 많이 쓰이는 패턴입니다. 오탐을 줄이기 위해 파일 크기나 헤더를 먼저 검사합니다.
condition:
uint16(0) == 0x5A4D and filesize < 2MB // MZ 헤더(exe 파일)이고 2MB 미만일 때
- uint16(0): 파일의 0번지부터 16비트(2바이트)를 읽어라. (윈도우 실행 파일은 항상 MZ 즉, 0x5A4D로 시작함)
5. YARA 룰 작성 3대 원칙 (Best Practices) ⭐
YARA 룰은 잘못 만들면 시스템을 멈추게 하거나, 정상 파일을 악성으로 잡는 대참사를 일으킵니다. 다음 3가지를 꼭 기억하세요.
1️⃣ 너무 짧은 문자열은 금지! (Performance)
- 나쁜 예: $a = "55" (헥사값도 아니고 문자열 "55")
- 이유: 파일 내에 "55"는 수만 번 등장할 수 있습니다. 스캔 속도가 엄청나게 느려집니다. 최소 5~6바이트 이상 유니크한 문자열을 쓰세요.
2️⃣ 오탐(False Positive) 주의! (Specificity)
- 나쁜 예: $s = "CreateFile"
- 이유: CreateFile은 정상적인 프로그램도 다 쓰는 함수입니다. 이걸 조건으로 걸면 윈도우 메모장도 악성코드로 잡힙니다. 악성코드에만 존재하는 특이한 문자열(C2 주소, 오타, 특이한 뮤텍스 등)을 찾으세요.
3️⃣ 조건문의 순서를 지켜라! (Short-Circuit Evaluation)
- 좋은 예: uint16(0) == 0x5A4D and $s1
- 설명: 컴퓨터는 앞에서부터 조건을 검사합니다. 파일 헤더가 MZ가 아니면 뒤에 있는 $s1은 검사조차 하지 않고 넘어갑니다. 가벼운 조건(파일 크기, 헤더)을 먼저 쓰고, 무거운 조건(문자열 검색)을 뒤에 쓰면 속도가 훨씬 빨라집니다.
🎉 마치며: 이제 당신도 룰 작성자!
YARA 룰은 단순해 보이지만, '어떤 문자열을 시그니처로 쓸 것인가?'를 결정하는 분석가의 통찰력이 담긴 결과물입니다.
오늘 배운 Meta(설명), Strings(증거), Condition(판단) 구조를 머릿속에 넣고, 여러분이 분석했던 악성코드의 특징을 룰로 옮겨보세요.
다음 시간에는 이렇게 작성한 YARA 룰을 가지고 실제 악성코드 파일들을 스캔하고 탐지하는 실습을 진행해보겠습니다. 기대해 주세요! 👋
'일반IT > IT보안' 카테고리의 다른 글
| [실습] "AI야, 룰 짜줘!" 🤖 선별된 특징으로 YARA 룰 1초 만에 자동 생성하기 (1) | 2025.12.18 |
|---|---|
| [실습] 악성코드의 '지문'을 채취하라! 🕵️♂️ 강력한 탐지를 위한 유니크 헥사(Hex) & 문자열 선별 기술 (0) | 2025.12.18 |
| [심화] "분석 끝난 줄 알았지?" 🕵️♂️ AI가 알려주는 '놓친 증거' 찾는 법 (의도 기반 아티팩트 추천) (0) | 2025.12.18 |
| [실습] "해커와 무슨 얘기를 나눴니?" 📡 C&C 서버 통신 패킷 분석 및 킬체인(Kill Chain) 분류 (0) | 2025.12.18 |
| [실습] "범행 시각, 14시 30분!" ⏱️ 악성 행위 타임라인(Timeline) 재구성과 시나리오 완성하기 (0) | 2025.12.18 |