안녕하세요, 명사수 보안 분석가 여러분! 🔫
지난 시간에 YARA 룰의 이론(Meta, Strings, Condition)을 배웠습니다. "문자열과 조건을 조합해서 탐지한다"는 원리는 이해하셨죠?
하지만 이론보다 더 중요한 것은 "도대체 '어떤' 문자열을 써야 하는가?"입니다.
아무거나 골라잡으면 윈도우 계산기(calc.exe)를 악성코드라고 탐지하는 대참사(오탐)가 벌어지거나, 해커가 글자 하나만 바꿔도 탐지에 실패(미탐)하게 됩니다.
오늘은 분석이 끝난 악성코드 샘플에서, 다른 정상 파일과는 겹치지 않는 '절대적인 유니크(Unique) 시그니처'를 선별해내는 실습을 진행하겠습니다.
이것만 잘해도 여러분의 YARA 룰은 명품이 됩니다! ✨

1. 💎 '유니크함'이란 무엇인가? (Golden Rule)
시그니처를 고를 때의 제1원칙은 "특이성(Specificity)"입니다.
- ❌ 나쁜 예 (너무 흔함):
- kernel32.dll, CreateFile, OpenProcess, HTTP/1.1
- 👉 전 세계 거의 모든 프로그램이 다 가지고 있는 내용입니다. 절대 쓰지 마세요!
- ✅ 좋은 예 (아주 특이함):
- C:\Users\Hacker\Project\Ransom\Release\main.pdb (개발자 경로)
- Global\{A1B2-C3D4-Hack-Me} (특이한 뮤텍스)
- E8 ?? ?? ?? ?? 83 C4 04 85 C0 74 12 (특정 암호화 함수의 기계어 코드)
우리는 이제 텍스트와 헥사(기계어), 두 가지 관점에서 이 보석 같은 지문을 찾아낼 것입니다.
2. 📝 [실습 1] 텍스트 문자열(Text Strings) 선별하기
가장 쉽고 직관적인 방법입니다. Strings 도구나 Pestudio를 통해 추출했던 목록을 다시 꺼내보세요.
🎯 선별 포인트 3가지
① 오타(Typos)와 비문 🤪
해커들은 급하게 코딩하느라 오타를 자주 냅니다. 정상적인 마이크로소프트 개발자라면 절대 내지 않을 오타는 최고의 시그니처입니다.
- 예시: Successflly (Successfully 오타), Dissable (Disable 오타)
- 팁: 문법이 틀린 문장도 아주 좋습니다. ("Your computer are belong to us")
② 하드코딩된 고유 경로 (PDB Path) 📂
개발자가 코드를 컴파일할 때 남는 디버깅 정보입니다. 사용자 이름이나 프로젝트명이 적나라하게 드러납니다.
- 예시: D:\Work\Malware_v2\Backdoor\payload.pdb
- 선별: Malware_v2나 Backdoor 같은 단어는 유니크합니다.
③ 특이한 포맷의 문자열 🔑
랜섬웨어의 경우 사용자 ID 생성이나 통신을 위해 특정한 형식을 사용합니다.
- 예시: uid=%d&os=%s&ver=2.1 (C2 통신 포맷)
- 예시: -----BEGIN RANSOM KEY----- (암호화 키 헤더)
3. 🧩 [실습 2] 헥사 스트링(Hex Strings) 선별하기 (심화)
텍스트는 해커가 쉽게 바꿀 수 있습니다. 하지만 코드의 구조(로직)는 쉽게 바꾸지 못합니다.
이때 사용하는 것이 바로 기계어 코드인 헥사 스트링입니다.
🛠️ 도구: Ghidra 또는 IDA Pro
👣 Step-by-Step 추출 방법
- 핵심 함수 이동: 지난 실습에서 찾았던 핵심 악성 행위 함수(예: 암호화 함수, C2 연결 함수)로 이동합니다.
- 바이트 보기: 어셈블리 명령어 옆에 있는 16진수 값(Opcode Bytes)을 확인합니다.
⚠️ [매우 중요] 와일드카드를 사용하라!
단순히 헥사 코드를 긁어오면 안 됩니다. '주소(Address)' 값은 파일이 실행될 때마다, 혹은 버전마다 바뀔 수 있기 때문입니다.
- 원본 코드: E8 40 12 00 00 ( CALL 0x00001240 )
- 여기서 40 12 00 00은 호출할 함수의 주소(상대 거리)입니다. 이건 바뀔 수 있습니다.
- E8은 CALL 명령어 자체입니다. 이건 안 바뀝니다.
- YARA 룰 변환: { E8 ?? ?? ?? ?? }
- 바뀔 수 있는 주소 부분은 물음표(??)로 처리하여 와일드카드(Wildcard)를 적용해야 합니다.
✅ 추천하는 헥사 패턴:
- 함수 도입부(Prolog): 55 8B EC (Push ebp; Mov ebp, esp) 처럼 너무 뻔한 건 피하세요.
- 특이한 상수값: 암호화 알고리즘에 쓰이는 고유 상수(0x67452301 등) 주변의 연산 코드가 좋습니다.
- 연속된 로직: XOR 연산 후 CMP(비교) 하고 JNZ(점프) 하는 일련의 흐름을 10~20바이트 정도 추출합니다.
4. ⚖️ [실습 3] 검증하기 (Sanity Check)
자, "이거다!" 싶은 문자열을 골랐나요? 마지막으로 구글에 검색해봐야 합니다.
🔍 구글링 테스트 (Google Dorking)
- 선별한 문자열을 큰따옴표(" ")로 묶어서 구글에 검색해보세요.
- 만약 GitHub의 유명한 오픈소스 프로젝트(예: OpenSSL, Boost Library)가 검색된다면?
- 🚨 탈락입니다! 그건 악성코드가 아니라 정상 라이브러리를 가져다 쓴 것입니다. 그걸 룰로 만들면 전 세계 PC를 오진하게 됩니다.
- 검색 결과가 없거나, 악성코드 분석 리포트만 나온다면?
- 🎉 합격입니다! 아주 훌륭한 시그니처입니다.
5. 📦 결과물 정리: 나만의 '지문' 리스트
실습을 통해 선별된 시그니처들을 아래와 같이 정리해 둡니다. 이것이 바로 다음 시간 YARA 룰 작성의 재료가 됩니다.
| 구분 | 값 (Value) | 특징 및 선정 이유 |
|---|---|---|
| String 1 | "C:\Project\Dark\bot.pdb" | 개발자 경로. 'Dark'라는 프로젝트명이 유니크함. |
| String 2 | "Don't kill my process!" | 악성코드 내부의 디버그 메시지. 문장이 특이함. |
| Hex 1 | { 33 C0 83 C4 04 B9 04 00 00 00 } | XOR 초기화 및 루프 카운터 설정 로직. |
| Hex 2 | { E8 ?? ?? ?? ?? 85 C0 74 0F } | 함수 호출 후 결과값이 0인지 비교하는 분기문 (주소는 와일드카드 처리). |
🎉 마치며: 룰 작성 준비 완료!
수고하셨습니다! 👏
여러분은 이제 수많은 데이터 쓰레기 더미 속에서 '진짜 증거(Signal)'를 걸러내는 눈을 가졌습니다.
- 텍스트에서는 오타와 PDB를 찾고,
- 헥사에서는 핵심 로직을 찾아 와일드카드를 씌웠으며,
- 구글링을 통해 검증까지 마쳤습니다.
이 재료들은 그 어떤 백신보다 강력한 탐지 성능을 발휘할 것입니다.
다음 시간에는 이 재료들을 YARA 문법에 맞춰 조립하는 "[실습] 최종 YARA 룰 파일(.yar) 작성 및 악성코드 탐지 테스트"를 진행하겠습니다.
나만의 백신을 만드는 그 순간까지, 화이팅! 🛡️🔍
'일반IT > IT보안' 카테고리의 다른 글
| [실습] "AI야, 룰 짜줘!" 🤖 선별된 특징으로 YARA 룰 1초 만에 자동 생성하기 (1) | 2025.12.18 |
|---|---|
| [이론] 악성코드 사냥꾼의 필수 무기! 🏹 YARA 룰 문법 완전 정복 (Meta, Strings, Condition) (0) | 2025.12.18 |
| [심화] "분석 끝난 줄 알았지?" 🕵️♂️ AI가 알려주는 '놓친 증거' 찾는 법 (의도 기반 아티팩트 추천) (0) | 2025.12.18 |
| [실습] "해커와 무슨 얘기를 나눴니?" 📡 C&C 서버 통신 패킷 분석 및 킬체인(Kill Chain) 분류 (0) | 2025.12.18 |
| [실습] "범행 시각, 14시 30분!" ⏱️ 악성 행위 타임라인(Timeline) 재구성과 시나리오 완성하기 (0) | 2025.12.18 |