안녕하세요, 보안 탐험가 여러분! 🕵️♀️🕵️♂️
지난 시간까지 우리는 분석 환경을 구축하고, AI에게 '제대로' 질문하는 프롬프트 엔지니어링 기초를 다졌습니다. 이제 이론은 충분합니다. 실전으로 들어갈 때가 되었습니다! 🔥
실제 악성코드를 분석하다 보면 main 함수 하나만 달랑 있는 경우는 거의 없습니다. 수십, 수백 개의 함수들이 거미줄처럼 얽혀있죠. 🕸️ 이 중에서 "진짜 중요한 기능을 하는 함수(Key Function)"를 찾아내고, 그 기능을 빠르게 파악하는 것이 분석가의 실력입니다.
하지만 어셈블리어와 복잡한 C 의사 코드(Pseudo-code)를 눈으로만 따라가다 보면 금방 지치기 마련입니다. 😵💫
오늘 실습에서는 기드라(Ghidra)에서 핵심 함수를 "콕" 집어내서, AI에게 던져주고 "딱" 요약받는, 분석 속도 10배 향상 루틴을 직접 해보겠습니다.
준비되셨나요? Let's Dive in! 🤿

🎯 실습 목표
- 기드라에서 분석 가치가 높은 주요 함수 블록을 식별한다.
- 해당 함수의 디컴파일 코드를 추출(Copy)한다.
- 지난 시간에 배운 프롬프트 엔지니어링을 적용하여 AI에게 입력을 구성한다.
- AI가 요약해준 기능을 바탕으로 분석 방향을 결정한다.
STEP 1. "범인은 이 안에 있어!" 주요 함수 식별하기 🧐
악성코드 안에는 수많은 함수가 있지만, 다 중요한 건 아닙니다. 우리는 '악성 행위'와 관련된 핵심 함수를 찾아야 합니다.
💡 팁: 어떤 함수를 골라야 할까요?
- 수상한 문자열을 참조하는 함수: "Encrypt", "Cmd.exe", "Password", IP 주소 문자열을 사용하는 함수는 강력한 용의자입니다. (기드라의 Window -> Defined Strings 활용)
- 위험한 API를 호출하는 함수: VirtualAlloc(메모리 할당), CreateRemoteThread(인젝션), connect(네트워크), WriteFile(파일 생성) 같은 API를 호출하는 함수를 따라가 보세요. (기드라의 Symbol Tree -> Imports 활용)
- 복잡한 연산을 수행하는 함수: 반복문(for/while)과 XOR, Shift 연산이 가득하다면 암호화 또는 난독화 해제 루틴일 확률이 높습니다.
[실습 상황 가정] 우리는 분석 중에 랜섬웨어로 의심되는 샘플에서 파일을 열고, 무언가 복잡한 반복문을 수행한 뒤, 파일을 다시 쓰는 함수 하나를 발견했습니다! 이름은 기드라가 임의로 붙인 FUN_1400012a0 입니다.
STEP 2. 코드 추출: "Ctrl+C, 복사의 미학" 📋
기드라의 디컴파일러(Decompiler) 뷰에 나타난 코드가 우리의 분석 대상입니다.
- 함수 선택: 분석하고 싶은 함수(FUN_1400012a0) 내부를 클릭합니다.
- 코드 전체 선택: 디컴파일러 창에서 마우스로 드래그하거나, Ctrl + A를 눌러 함수 코드 전체를 선택합니다.
- 복사: Ctrl + C를 눌러 클립보드에 복사합니다.
⚠️ 주의: 함수가 너무 길다면(예: 수천 줄), AI의 입력 한도(Token limit)를 초과할 수 있습니다. 이럴 땐 핵심적인 반복문이나 조건문 블록만 부분적으로 복사하는 센스가 필요합니다!
STEP 3. AI 심문하기: "자, 배운 대로 질문해보자!" 🗣️
이제 복사한 코드를 들고 AI(ChatGPT, Claude 등)에게 갑니다. 지난 시간에 배운 마법의 공식 기억나시죠?
[페르소나] + [컨텍스트] + [데이터(코드)] + [지시사항(목표)]
이 공식을 적용해서 프롬프트를 작성해봅시다.
🧑💻 [나의 프롬프트 입력]:
**역할 (Persona):** 당신은 시니어 악성코드 리버스 엔지니어입니다.
**컨텍스트 (Context):** 나는 현재 랜섬웨어로 의심되는 윈도우 실행 파일(.exe)을 분석 중입니다. 기드라(Ghidra)를 통해 파일을 열고 쓰기 작업을 수행하는 것으로 보이는 의심스러운 함수 하나를 추출했습니다.
**지시사항 (Goal):**
1. 아래 제공된 C언어 의사 코드(Pseudo-code)의 핵심 기능을 **3줄 이내로 요약**해주세요.
2. 이 함수가 악성 행위(예: 파일 암호화, 데이터 유출 등)와 관련이 있을 가능성을 '상/중/하'로 평가하고 그 이유를 설명해주세요.
3. 코드 내에서 주목해야 할 중요한 지역 변수나 파라미터가 있다면 지적해주세요.
**코드 (Data):**
```c
// (여기에 아까 기드라에서 복사한 코드를 붙여넣으세요)
// 예시 코드 (실제로는 훨씬 복잡하겠지만 느낌만 보세요!)
void FUN_1400012a0(char *filePath, byte *key, int keyLen) {
HANDLE hFile = CreateFileA(filePath, ...);
// ... 파일 읽기 생략 ...
byte *fileBuffer = VirtualAlloc(..., fileSize, ...);
ReadFile(hFile, fileBuffer, ...);
// 수상한 반복문 시작
for (int i = 0; i < fileSize; i++) {
fileBuffer[i] = fileBuffer[i] ^ key[i % keyLen]; // XOR 연산
}
SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
WriteFile(hFile, fileBuffer, ...); // 덮어쓰기
CloseHandle(hFile);
}
STEP 4. 결과 분석: AI의 답변을 검증하라! ✅
AI가 답변을 내놓았습니다. 결과를 확인하고 우리의 분석 방향과 맞는지 검증해야 합니다.
🤖 [AI의 답변 예시]:
📝 핵심 기능 요약: 이 함수는 지정된 파일 경로(filePath)의 파일을 열어 메모리에 할당(VirtualAlloc)한 후, 전달받은 키(key)를 사용하여 바이트 단위로 XOR 연산을 수행하고, 결과를 원본 파일에 덮어씁니다.
🚨 악성 가능성 평가: [상] 이유: 파일 내용을 읽어서 XOR 연산(가장 기초적인 암호화/난독화 기법)으로 변조한 뒤 다시 원본에 덮어쓰는 행위는 랜섬웨어의 파일 암호화 루틴에서 매우 전형적으로 나타나는 패턴입니다. 정상적인 프로그램이 파일을 이런 식으로 덮어쓰는 경우는 드뭅니다.
👀 주목할 변수:
- filePath (파라미터 1): 어떤 파일이 암호화 대상이 되는지 확인이 필요합니다.
- key (파라미터 2): 암호화에 사용되는 키 값입니다. 이 키가 어디서 생성되었는지 추적하는 것이 중요합니다. (복호화 도구 제작의 핵심!)
🎉 실습 마무리: 분석 속도의 혁명
어떤가요? 복잡해 보이는 코드 덩어리를 AI에게 던져주니, 불과 몇 초 만에 "아, 이거 랜섬웨어 암호화 루틴이네. 키(Key) 찾는 게 중요하겠군!" 하고 핵심을 파악했습니다. ⚡
만약 이걸 혼자서 한 줄 한 줄 해석했다면 20~30분은 족히 걸렸을 겁니다. AI는 우리의 시간을 아껴주고, 숲을 보게 해 줍니다.
오늘의 핵심 루틴을 잊지 마세요:
- 기드라에서 수상한 놈을 찾는다. 🕵️
- 코드를 복사한다. 📋
- AI에게 페르소나를 주며 물어본다. 🗣️
- 답변을 보고 다음 분석 대상을 정한다. (예: key 파라미터를 누가 넘겨주는지 추적하자!)
다음 시간에는 이렇게 AI가 "수상하다"고 지목한 함수들이 실제 동작할 때 어떤 데이터를 주고받는지 확인하는 '동적 분석'과의 연계 방법에 대해 알아보겠습니다.
분석의 즐거움을 느끼는 하루 보내세요! 화이팅! 💪
'일반IT > IT보안' 카테고리의 다른 글
| [심화] "그 함수, 진짜 그냥 복사만 할까?" 🕵️♂️ 분석가가 놓치는 은밀한 서브루틴, AI로 검거하기 (0) | 2025.12.11 |
|---|---|
| [실습] "AI야, 그 말 진짜야?" 🤨 AI 분석 결과와 어셈블리(Assembly) 코드 교차 검증하기 (0) | 2025.12.11 |
| [실습] AI에게 "제대로" 질문하는 법! 🗣️ 악성코드 분석을 위한 프롬프트 엔지니어링 A to Z (0) | 2025.12.11 |
| [실습] 내 생애 첫 리버스 엔지니어링! 🧑💻 'Hello World'를 기드라(Ghidra)로 뜯어보고 AI에게 물어보자 (0) | 2025.12.11 |
| [보안 스터디] 악성코드 분석, 이제 AI랑 같이 하자! 🤖 (Ghidra + ChatGPT 환경 구축 가이드) (0) | 2025.12.11 |