본문 바로가기
일반IT/IT보안

[실습] 복잡한 함수도 3초 컷? ⏱️ 기드라(Ghidra)로 추출하고 AI로 요약하는 실전 분석 루틴!

by gasbugs 2025. 12. 11.

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

지난 시간까지 우리는 분석 환경을 구축하고, AI에게 '제대로' 질문하는 프롬프트 엔지니어링 기초를 다졌습니다. 이제 이론은 충분합니다. 실전으로 들어갈 때가 되었습니다! 🔥

실제 악성코드를 분석하다 보면 main 함수 하나만 달랑 있는 경우는 거의 없습니다. 수십, 수백 개의 함수들이 거미줄처럼 얽혀있죠. 🕸️ 이 중에서 "진짜 중요한 기능을 하는 함수(Key Function)"를 찾아내고, 그 기능을 빠르게 파악하는 것이 분석가의 실력입니다.

하지만 어셈블리어와 복잡한 C 의사 코드(Pseudo-code)를 눈으로만 따라가다 보면 금방 지치기 마련입니다. 😵‍💫

오늘 실습에서는 기드라(Ghidra)에서 핵심 함수를 "콕" 집어내서, AI에게 던져주고 "딱" 요약받는, 분석 속도 10배 향상 루틴을 직접 해보겠습니다.

준비되셨나요? Let's Dive in! 🤿

 


🎯 실습 목표

  1. 기드라에서 분석 가치가 높은 주요 함수 블록을 식별한다.
  2. 해당 함수의 디컴파일 코드를 추출(Copy)한다.
  3. 지난 시간에 배운 프롬프트 엔지니어링을 적용하여 AI에게 입력을 구성한다.
  4. 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) 뷰에 나타난 코드가 우리의 분석 대상입니다.

  1. 함수 선택: 분석하고 싶은 함수(FUN_1400012a0) 내부를 클릭합니다.
  2. 코드 전체 선택: 디컴파일러 창에서 마우스로 드래그하거나, Ctrl + A를 눌러 함수 코드 전체를 선택합니다.
  3. 복사: 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는 우리의 시간을 아껴주고, 숲을 보게 해 줍니다.

오늘의 핵심 루틴을 잊지 마세요:

  1. 기드라에서 수상한 놈을 찾는다. 🕵️
  2. 코드를 복사한다. 📋
  3. AI에게 페르소나를 주며 물어본다. 🗣️
  4. 답변을 보고 다음 분석 대상을 정한다. (예: key 파라미터를 누가 넘겨주는지 추적하자!)

다음 시간에는 이렇게 AI가 "수상하다"고 지목한 함수들이 실제 동작할 때 어떤 데이터를 주고받는지 확인하는 '동적 분석'과의 연계 방법에 대해 알아보겠습니다.

분석의 즐거움을 느끼는 하루 보내세요! 화이팅! 💪