본문 바로가기
일반IT/IT보안

[실습] "이거 아까 걔 아냐?" 👯‍♂️ 악성코드 원본 vs 변종, AI로 유전자 검사(유사도 분석) 하기

by gasbugs 2025. 12. 14.

안녕하세요, 끝까지 추적하는 보안 연구원 여러분! 🕵️‍♂️

사이버 보안의 세계는 끝없는 '술래잡기'입니다. 보안 업체가 특정 악성코드를 탐지해내면, 해커들은 며칠 뒤(심지어 몇 시간 뒤)에 코드를 살짝 비튼 '변종(Variant)'을 내놓습니다.

겉옷만 갈아입은 녀석, 성형수술을 한 녀석, 무기를 바꾼 녀석... 종류도 다양하죠. 🎭

이때 분석가가 "이 새로운 녀석이 예전에 그 녀석과 같은 놈인가?"를 밝혀내는 작업을 코드 유사도 분석(Code Similarity Analysis)이라고 합니다.

과거에는 BinDiff 같은 도구를 눈이 빠져라 쳐다봐야 했지만, 이제는 AI가 순식간에 두 코드의 유전자를 비교해줍니다. 오늘은 AI를 활용해 악성코드 원본과 변종 사이의 '틀린 그림 찾기'를 하는 실습을 진행해보겠습니다. 🔍

 


1. 왜 유사도 분석을 해야 하나요? 🤷‍♀️

악성코드의 90% 이상은 기존 코드의 재탕입니다. 바퀴를 매번 새로 발명할 필요가 없으니까요.

  • 탐지 회피: 백신의 시그니처(지문) 탐지를 피하기 위해 변수명이나 함수 순서만 바꿉니다.
  • 기능 업그레이드: 기존 랜섬웨어에 '정보 탈취' 기능을 추가하거나, 암호화 알고리즘을 강화합니다.
  • 공격자 추적 (Attribution): "어? 이 코딩 스타일, 작년에 활동한 'Lazarus' 그룹이랑 95% 똑같은데?" 라는 단서를 얻을 수 있습니다.

2. [준비] 원본과 변종 코드 준비 (Decompiled) 📂

분석을 위해서는 바이너리(EXE) 상태보다는, 기드라(Ghidra)나 IDA를 통해 C언어 형태로 복원된 의사 코드(Pseudocode)가 필요합니다.

📁 [Sample A] 원본 랜섬웨어 (Original)

C

// 원본: 단순한 파일 암호화 루프
void EncryptFiles() {
    char* key = "1234"; // 취약한 하드코딩 키
    FileInfo file = FindFirstFile("*.*");
    while (file) {
        XOR_Encrypt(file, key); // 단순 XOR 암호화
        file = FindNextFile();
    }
}

📁 [Sample B] 변종 랜섬웨어 (Variant)

C

// 변종: 키 생성 방식 변경 및 기능 추가
void ProcessData() { // 함수 이름 변경됨
    char* key = GenerateRandomKey(); // 랜덤 키 생성으로 강화
    FileInfo f = FindFirstFile("*.*");
    while (f) {
        if (IsSystemFile(f)) continue; // [변경점] 시스템 파일은 건너뜀 (안전장치)
        AES_Encrypt(f, key); // [변경점] AES로 알고리즘 변경
        f = FindNextFile();
    }
}

딱 봐도 구조는 비슷한데, 디테일이 많이 바뀌었죠? 이걸 AI에게 맡겨봅시다.


3. AI에게 "유전자 검사" 요청하기 🧬

단순히 "두 개 비교해줘"라고 하면 AI는 텍스트가 다른 점만 찾습니다. 우리는 '기능적/논리적 차이'를 원하므로 프롬프트를 잘 써야 합니다.

🗣️ [Prompt] 유사도 분석 프롬프트

[역할] 당신은 악성코드 리버스 엔지니어링 전문가입니다.

[작업] 아래 제공된 두 개의 C 코드(Sample A, Sample B)를 비교 분석하세요.

Sample A는 원본 악성코드이고, Sample B는 그 변종으로 추정됩니다.

[요청사항]

  1. 유사도 점수: 두 코드의 논리적 구조와 흐름을 기반으로 유사도를 0~100% 사이로 추정하세요.
  2. 주요 변경 사항 (Diff): 변수명 변경 같은 사소한 것은 무시하고, 알고리즘, 로직, 기능적 추가/삭제 위주로 차이점을 설명하세요.
  3. 변종의 의도: 공격자가 코드를 이렇게 수정한 이유(탐지 회피, 기능 강화 등)를 추론하세요.

[Sample A 코드]

(위의 원본 코드 붙여넣기)

[Sample B 코드]

(위의 변종 코드 붙여넣기)


4. [결과] AI의 정밀 분석 리포트 📝

AI는 변수명이 file에서 f로 바뀐 건 중요하지 않다는 걸 압니다. 대신 핵심 로직의 변화를 짚어냅니다.

🤖 AI 분석 리포트

1. 📊 유사도 추정: 약 70%

  • 근거: 파일 탐색 루프(FindFirstFile -> while -> FindNextFile)의 전체적인 뼈대(Structure)는 동일합니다. 하지만 내부 처리 로직에서 중요한 변화가 감지되었습니다.

2. 🔄 주요 변경 사항 (Key Differences)

  • 암호화 강도 강화: 단순 XOR 연산이 고급 암호화 표준인 AES로 변경되었습니다.
  • 키 관리 방식: 하드코딩된 키("1234")가 GenerateRandomKey()를 통한 동적 생성 방식으로 바뀌어 복호화가 어려워졌습니다.
  • 안전장치 추가: IsSystemFile() 체크 로직이 추가되었습니다. 이는 윈도우 중요 파일을 암호화해서 부팅 불능이 되는 것을 막기 위함입니다.

3. 😈 변종의 의도 추론

이 변종의 제작자는 기존 버전이 보안 업체에 의해 너무 쉽게 복호화되자, 암호화 알고리즘을 고도화하여 피해자가 돈을 낼 수밖에 없도록 만들었습니다. 또한 시스템 안정성을 높여 '먹튀(랜섬 비용만 받고 복구 불가)' 논란을 피하려는 의도가 보입니다.


5. 실습의 핵심 포인트: Diffing(디핑)의 미학 ✨

이 실습을 통해 우리는 다음과 같은 인사이트를 얻을 수 있습니다.

  1. 제어 흐름 그래프(CFG)의 중요성: 변수 이름은 바뀌어도 While 문 안에서 If 문이 도는 구조는 쉽게 변하지 않습니다. AI는 이 구조적 유사성을 잘 봅니다.
  2. 노이즈 제거: AI에게 "변수명 변경은 무시해"라고 함으로써, 정말 중요한 기능적 차이에만 집중할 수 있었습니다.
  3. 대응 전략 수립: "아, 이번 변종은 AES를 쓰는구나. 그럼 메모리에서 키가 생성될 때를 노려야겠네?" 하고 분석 방향을 잡을 수 있습니다.

🎉 마치며

오늘 우리는 AI를 활용해 악성코드의 족보(?)를 분석해 보았습니다.

과거에는 두 모니터에 코드를 띄워놓고 "틀린 그림 찾기"를 하느라 눈이 시뻘게졌지만, 이제는 AI가 초벌구이를 해주니 우리는 '공격자의 의도 파악'이라는 더 고차원적인 업무에 집중할 수 있게 되었습니다.

다음 시간에는 지금까지 배운 모든 분석 내용을 종합하여, "최종 악성코드 분석 보고서 자동 생성" 실습을 진행하며 이 시리즈를 멋지게 마무리해보겠습니다.

여러분의 분석이 언제나 명쾌하기를 바랍니다! 화이팅! 💪