FLOSS - 악성코드의 난독화된 문자열 추출 치트시트
FLOSS (Mandiant의 FLARE Obfuscated String Solver)는 악성코드에서 난독화된 문자열을 자동으로 추출합니다. 작성자는 URL, 레지스트리 키, 명령을 일상적으로 숨기므로 고전적인 strings 유틸리티는 유용한 것을 찾지 못합니다. FLOSS는 더 나아갑니다. 바이너리 내부의 디코딩 루틴을 식별하고 에뮬레이트한 후 평문을 복구합니다. 정적 추출이 놓칠 수 있는 스택 문자열, 타이트 문자열, 디코드된 문자열을 표면화합니다. 이는 모든 Windows 악성코드 샘플의 첫 번째 심사 도구입니다.
격리된 VM/샌드박스에서만 악성코드를 분석하세요. FLOSS는 샘플의 코드를 에뮬레이트합니다.
설치
| 방법 | 명령 |
|---|
| 독립 실행형 바이너리 | GitHub Releases에서 다운로드 (Windows/Linux/macOS) |
| pip | pip install flare-floss |
| 확인 | floss --version |
기본 사용법
| 명령 | 설명 |
|---|
floss malware.exe | 모든 문자열 유형 추출 |
floss -j malware.exe | JSON 출력 |
floss --no static malware.exe | 일반 정적 문자열 건너뛰기 |
floss -n 6 malware.exe | 최소 문자열 길이 6 |
floss --help | 전체 옵션 목록 |
FLOSS가 복구하는 문자열 유형
| 유형 | 무엇인지 |
|---|
| 정적 | 일반 문자열 (strings가 찾는 것) |
| 스택 | 런타임에 스택에서 한 문자씩 구축됨 |
| 타이트 | 타이트 루프에서 구축, 메모리에 한 번도 완전히 존재하지 않음 |
| 디코드됨 | 디코딩 루틴 (XOR, RC4, 커스텀)에서 생성됨 |
마지막 세 가지가 가치 추가입니다. strings가 발견하지 못합니다. 파일에 연속된 바이트로 존재한 적이 없기 때문입니다.
분석 유형 선택
| 플래그 | 효과 |
|---|
--only static | 평문 문자열만 (빠름) |
--only stack | 스택 문자열만 |
--only tight | 타이트 문자열만 |
--only decoded | 에뮬레이트/디코드된 문자열만 |
--no decoded | 에뮬레이션 단계 건너뛰기 (느림) |
# 빠른 심사: 에뮬레이션 건너뛰기
floss --no decoded sample.exe
# 심층 전달: 모든 것, JSON으로 도구화
floss -j sample.exe > strings.json
심사 신호를 Grep 처리
| 패턴 | 제안 |
|---|
| URL / IP | C2 인프라 |
HKLM\, HKCU\ | 레지스트리를 통한 지속성 |
cmd.exe, powershell | 명령 실행 |
CreateRemoteThread, VirtualAlloc | 프로세스 인젝션 |
| Base64 블롭 | 임베드된 페이로드 |
.onion, 지갑 주소 | 랜섬웨어/유출 |
floss sample.exe | grep -iE "http|\.exe|HKLM|powershell|AppData"
출력 및 통합
| 옵션 | 목적 |
|---|
-j / --json | 파이프라인용 기계 가독 출력 |
-v / -vv | 상세 / 디버그 |
--functions 0x401000 | 특정 함수에 에뮬레이션 집중 |
| IDA/Ghidra 스크립트 | 복구된 문자열을 디스어셈블리에 다시 주석 처리 |
FLOSS 출력을 Ghidra에 댓글로 다시 피드하면 후속 수동 분석이 훨씬 빨라집니다.
일반적인 워크플로우
# 표준 악성코드 심사 시퀀스
floss -j sample.exe > floss.json # 문자열 복구
jq -r '.strings.decoded[].string' floss.json | sort -u # 디코드된 것에 집중
# → 흥미로운 문자열을 생성한 함수의 Ghidra/x64dbg로 피벗
# 변형 비교: 샘플 간 어떤 문자열이 변경되었습니까?
floss --no decoded a.exe > a.txt; floss --no decoded b.exe > b.txt
diff a.txt b.txt
FLOSS vs 관련 도구
| 도구 | 복구 |
|---|
| FLOSS | 정적 + 스택 + 타이트 + 디코드됨 (에뮬레이션) |
strings | 연속된 인쇄 가능한 바이트만 |
| capa | 기능/동작, 문자열 아님 |
| Detect It Easy | 패커/컴파일러 식별 |
표준 심사 트리오: Detect It Easy로 패킹 식별, FLOSS로 문자열 복구, capa로 기능 열거.
리소스