안녕하세요, 깊이 있는 분석을 지향하는 보안 연구원 여러분! 🦅
우리가 악성코드를 분석할 때 가장 많이 하는 실수가 무엇일까요? 바로 "가정(Assumption)"입니다.
main 함수에서 수많은 CALL 명령어를 만납니다. "음, FUN_00401200? 내부를 보니 파라미터 두 개 받고 루프 도네? 그냥 strcpy나 memcpy 같은 문자열 복사 함수겠지. 패스!"
...하고 넘어가는 순간, 여러분은 악성코드 제작자의 함정에 빠진 걸 수도 있습니다. 😱 악성코드 제작자들은 분석가들이 귀찮아서 건너뛸 만한 '단순해 보이는 서브루틴' 안에 암호화 해제 로직이나 안티 디버깅 코드를 숨겨두곤 하거든요.
오늘은 분석가가 무심코 지나치기 쉬운 서브루틴(Subroutine)의 숨겨진 발톱을 AI와의 교차 검증을 통해 찾아내는 심화 기술을 실습해 보겠습니다.

1. 서브루틴의 딜레마: "이걸 다 봐야 해?" 😫
악성코드는 수백, 수천 개의 함수로 이루어져 있습니다. 이걸 하나하나 다 뜯어보는 건 불가능하죠. 그래서 우리는 경험적으로 '패턴'을 보고 판단합니다.
- 패턴 A: 루프 돌면서 0이 나올 때까지 카운팅함 -> strlen (문자열 길이 계산)이네. (Skip)
- 패턴 B: 소스에서 목적지로 바이트 옮김 -> memcpy (메모리 복사)네. (Skip)
하지만, 만약 그 함수가 복사를 하면서 동시에 악성 쉘코드를 디코딩하고 있다면요? 💣
2. 실습 시나리오: 위장된 함수 FUN_CopyOrNot 🎭
기드라(Ghidra)에서 아래와 같은 C 의사 코드를 발견했다고 가정해 봅시다.
// 분석가가 '단순 복사'라고 착각하기 쉬운 코드
void FUN_CopyOrNot(byte *dest, byte *src, int length) {
int i;
for (i = 0; i < length; i = i + 1) {
byte bVar1 = src[i];
// ... 뭔가 복잡한 변수 할당 ...
if ((i % 5) == 0) {
// 분석가가 대충 보고 넘길만한 조건문
dest[i] = bVar1 ^ 0x41;
} else {
dest[i] = bVar1;
}
}
return;
}
사람 눈으로 대충 훑으면 src를 dest로 옮기는 복사 함수처럼 보입니다. 중간에 if문이 좀 있지만, "뭐 패딩 처리나 인코딩인가 보다" 하고 넘어가기 딱 좋죠.
하지만 여기엔 5번째 바이트마다 XOR 0x41(Key 'A')을 수행하는 난독화 해제 로직이 숨어있습니다. 이걸 놓치면 뒤쪽 코드에서 엉뚱한 데이터를 보게 됩니다.
3. AI 교차 검증: "의심하고, 또 의심하라" 🧐
이제 이 코드를 AI에게 던져서 교차 검증을 시도해 봅니다. 여기서 중요한 건 "단순 요약해줘"가 아니라 "이상한 점을 찾아줘"라고 묻는 것입니다.
❌ 나쁜 프롬프트 (일반 요약)
"이 함수 뭐하는 거야?" -> AI 답변: "주어진 길이만큼 소스 배열을 대상 배열로 복사하는 함수입니다.
특정 조건에 따라 값을 변경합니다." (너무 평범해서 위험성을 못 느낌)
✅ 좋은 프롬프트 (교차 검증용)
[역할 부여]
당신은 악성코드의 은닉 기법을 찾아내는 보안 분석 전문가입니다.
[목표]
아래 코드는 단순한 메모리 복사 함수(memcpy)처럼 보입니다. 하지만 나는 이 함수가 '부수 효과(Side Effect)'를 가지고 있을 것이라 의심합니다.
[요청사항]
- 이 함수가 표준 라이브러리 함수(strcpy, memcpy 등)와 결과적으로 다른 점이 무엇인지 정확히 지적하세요.
- 데이터가 변조(Modification)되는 라인이 있다면 찾아서 그 의미(XOR, Shift 등)를 해석하세요.
- 이 기법이 악성코드에서 주로 어떤 목적으로 사용되는지 추론하세요.
[코드]
(위의 코드 붙여넣기)
4. AI의 분석 결과: "딱 걸렸어!" 🚨
제대로 된 프롬프트를 입력하면 AI는 현미경처럼 코드를 뜯어봅니다.
🤖 AI 분석 리포트
1. 이상 징후 발견 (Anomaly Detection) 이 함수는 단순 memcpy가 아닙니다. 표준 복사 함수는 데이터를 그대로 옮기지만, 이 함수는 조건부 데이터 변조를 수행합니다.
2. 핵심 로직 분석
- if ((i % 5) == 0): 인덱스가 5의 배수일 때마다 분기가 발생합니다.
- dest[i] = bVar1 ^ 0x41;: XOR 0x41 연산이 수행됩니다. 이는 단순 복사가 아니라 '인라인 복호화(Inline Decryption)' 과정입니다.
3. 분석가 조언 이 함수를 거친 데이터(dest)는 원본 데이터(src)와 내용이 달라집니다. 만약 src가 암호화된 쉘코드였다면, dest에는 실행 가능한 공격 코드가 담기게 됩니다. 절대 이 함수를 '단순 복사'라고 라벨링(Labeling)하고 넘어가면 안 됩니다!
5. 우리의 대응: 함수 이름 바꾸기 (Renaming) 🏷️
AI 덕분에 우리는 함정을 피했습니다. 이제 기드라로 돌아가서 할 일은 딱 하나입니다.
- 함수 이름 FUN_CopyOrNot 우클릭
- Rename Function 클릭
- Decryption_Copy_XOR_41 로 변경
이제 이 함수를 호출하는 모든 곳에서 "아! 저거 암호화 푸는 거였지!" 라고 직관적으로 알 수 있게 되었습니다. 이렇게 서브루틴 하나를 제대로 분석하면, 전체 프로그램의 흐름이 마법처럼 풀리기도 합니다. 🗝️
💡 오늘의 꿀팁 (Takeaway)
- 서브루틴을 무시하지 마세요: 악마는 디테일(Helper Function)에 숨어 있습니다.
- 표준 함수와 비교하세요: "이게 strcpy랑 100% 똑같은가?"를 AI에게 물어보세요.
- 매직 넘버를 찾으세요: 코드 중간에 0x41, 0xFF 같은 상수가 뜬금없이 등장하면 무조건 의심하세요.
- AI를 '레드팀'으로 쓰세요: "내가 놓친 취약점이나 트릭이 있을까?"라고 역으로 질문하세요.
여러분의 분석 시야가 AI와 함께 더 넓고 깊어지기를 바랍니다! 다음 시간에는 분석의 꽃, "분석 보고서 자동화"로 찾아오겠습니다.
해피 리버싱! 💻✨
'일반IT > IT보안' 카테고리의 다른 글
| [실습] 난독화된 코드, AI가 토하지 않게 떠먹여주기! 🥄 (청크 분할 전략) (0) | 2025.12.11 |
|---|---|
| [이론] 해커들의 은신술! 🥷 악성 스크립트 난독화(Obfuscation) 기법 완벽 해부 (0) | 2025.12.11 |
| [실습] "AI야, 그 말 진짜야?" 🤨 AI 분석 결과와 어셈블리(Assembly) 코드 교차 검증하기 (0) | 2025.12.11 |
| [실습] 복잡한 함수도 3초 컷? ⏱️ 기드라(Ghidra)로 추출하고 AI로 요약하는 실전 분석 루틴! (0) | 2025.12.11 |
| [실습] AI에게 "제대로" 질문하는 법! 🗣️ 악성코드 분석을 위한 프롬프트 엔지니어링 A to Z (0) | 2025.12.11 |