
의심스러운 실행 파일을 열었는데 strings 출력이 텅 비었거나, 반대로 의미 없는 문자열로 가득하다면 문제는 "문자열을 더 뽑을 수 있나"가 아닙니다. 지금 이 샘플에 시간을 더 써야 하는지, 샌드박스로 넘길지, 리버싱을 시작할지 결정해야 합니다.
최근 FLARE-FLOSS를 활용해 고전적인 문자열 분석을 넘어 숨겨진 악성코드 IOC를 복구하는 구현 방식이 다시 조명됐습니다.1 중요한 점은 FLOSS를 "더 강한 strings"로 보는 것이 아니라, 악성코드가 분석가의 시간을 낭비하도록 설계된 상황에서 다음 행동을 정하게 해주는 초기 판단 신호로 보는 것입니다.
FLOSS가 실제로 바꾸는 것은 출력이 아니라 다음 행동이다
FLARE-FLOSS는 Mandiant의 FLARE 팀이 공개한 오픈소스 도구로, 일반 ASCII·UTF-16LE 정적 문자열뿐 아니라 런타임에 스택에서 조립되는 문자열, 디코딩 함수로 풀리는 문자열, 이른바 tight string까지 추출하도록 설계됐습니다.2
이 사실의 실무적 의미는 분명합니다. 많은 악성코드는 전체 바이너리를 강하게 패킹하지 않고, C2 도메인·파일 경로·레지스트리 키·동적 API 이름처럼 분석 가치가 큰 문자열만 가볍게 숨깁니다. 전체 패킹은 엔트로피, 섹션 특성, 적은 임포트 수 같은 흔적으로 오히려 눈에 띌 수 있기 때문입니다.3
따라서 FLOSS의 장점은 "모든 것을 해독한다"가 아닙니다. strings에는 없던 도메인, URL 조각, mutex, 명령어 문자열, API 이름이 갑자기 보인다면 그 샘플은 더 깊게 볼 가치가 있다는 신호입니다. 반대로 FLOSS에서도 유의미한 차이가 없다면 동적 분석, 메모리 덤프, 언패킹으로 바로 넘어가야 할 수 있습니다.
static, stack, decoded 문자열은 같은 증거가 아니다
FLOSS 출력은 한 덩어리로 믿으면 안 됩니다. 문자열의 출처에 따라 신뢰도와 해석 방식이 다릅니다.
정적 문자열은 전통적인 strings 결과와 가장 가깝습니다. 컴파일러 흔적, 라이브러리 메시지, 에러 문구가 많이 섞입니다. 빠른 감에는 좋지만 IOC로 바로 쓰기엔 노이즈가 큽니다.
스택 문자열은 더 흥미롭습니다. 실행 중 코드가 바이트 단위로 조립하는 문자열이기 때문에 악성 행위와 가까운 경우가 많습니다. 파일 경로, 명령 옵션, 레지스트리 경로가 여기서 나오면 분석의 방향을 잡는 데 유용합니다.
디코딩된 문자열은 가장 가치 있을 수 있지만, 동시에 가장 조심해야 합니다. FLOSS는 후보 디코딩 루틴을 휴리스틱으로 찾고 에뮬레이션을 통해 전후 메모리 상태를 비교합니다.3 이 방식은 빠르지만, 모든 난독화와 모든 실행 경로를 보장하지는 않습니다. 즉 "나왔다"는 강한 단서지만, "반드시 실제 통신에 쓰인다"는 결론은 아닙니다.
FLOSS가 시간을 아끼는 경우와 헷갈리게 하는 경우
FLOSS가 특히 빛나는 상황은 단순 난독화입니다. 단일 바이트 XOR, 반복 호출되는 문자열 디코더, 스택에 조립되는 경로처럼 사람이 보면 금방 알지만 매번 손으로 풀기 귀찮은 패턴에서 시간을 크게 줄입니다.
Go나 Rust 바이너리에서도 의미가 있습니다. FLOSS는 고전적인 strings 알고리즘이 잘 다루지 못하는 일부 언어별 문자열 형식을 식별해 사람이 보기 쉬운 형태로 추출할 수 있다고 설명합니다.2
하지만 반론도 필요합니다. FLOSS는 언패커가 아닙니다. 강하게 패킹된 샘플, 환경 조건을 만족해야만 복호화되는 설정, 네트워크에서 받아오는 2단계 페이로드에는 한계가 있습니다. 또한 공격자가 일부러 심은 가짜 도메인이나 보안 도구 이름이 출력될 수도 있습니다.
실무적으로는 FLOSS 결과를 IOC 목록이 아니라 "검증할 후보 목록"으로 다뤄야 합니다. 도메인은 DNS·샌드박스·프록시 로그와 맞춰보고, API 이름은 임포트·동적 로딩 코드와 연결해 보고, 파일 경로는 행위 로그와 대조해야 합니다.
의심 바이너리에서 실행 가능한 5분 워크플로
간단한 절차는 이렇습니다.
해시를 먼저 계산하고, 공개 업로드가 민감한 샘플인지 판단합니다.
strings또는 PE 분석 도구로 기준선을 잡습니다.floss sample.exe를 실행하고, 필요하면--no static또는--only stack decoded tight로 노이즈를 줄입니다. FLOSS는 특정 타입만 추출하거나 JSON 출력으로 후속 분석에 넘길 수 있습니다.4기존
strings에 없던 문자열만 따로 모읍니다. 도메인, IP, URL, 경로, 레지스트리, 명령어, API 이름으로 묶습니다.결과에 따라 다음 행동을 정합니다. 유효한 C2 후보가 있으면 인프라 피벗을, 디코더 흔적이 강하면 리버싱을, 출력이 빈약하면 동적 분석이나 언패킹을 우선합니다.
핵심은 자동화가 판단을 대신하지 않는다는 점입니다. FLOSS는 분석가가 시간을 써야 할 위치를 좁혀줍니다. 침해대응팀, 악성코드 초동 분석가, SOC의 샘플 triage 담당자라면 FLOSS를 체크리스트의 한 줄이 아니라 "다음 30분을 어디에 쓸지 정하는 도구"로 배치하는 편이 더 낫습니다.
참고
4FireEye Labs Obfuscated Strings Solver(ツール解説) | サイバーセキュリティ情報局
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
