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

[실습] 내 생애 첫 리버스 엔지니어링! 🧑‍💻 'Hello World'를 기드라(Ghidra)로 뜯어보고 AI에게 물어보자

by gasbugs 2025. 12. 11.

안녕하세요! 보안 꿈나무 여러분 🌱

지난 시간에 우리는 강력한 무료 리버스 엔지니어링 도구인 기드라(Ghidra) 설치를 마쳤습니다. 도구를 설치했으면 이제 써봐야겠죠?

하지만 처음부터 거창한 악성코드를 분석하려고 하면 머리만 아프고 금방 지쳐버립니다. 🤯 그래서 오늘은 가장 기초적이지만 가장 중요한 첫걸음, "Hello World" 프로그램을 분석해 볼 거예요.

"에이, Hello World는 그냥 출력만 하는 거잖아요?" 라고 생각하시나요? 네, 맞습니다! 하지만 '우리가 아는 소스코드''컴퓨터가 이해하는 기계어'로 바뀌고, 그걸 다시 '우리가 알아볼 수 있게 복원(디컴파일)'하는 과정을 이해하는 데 이만한 예제가 없습니다.

여기에 우리의 든든한 지원군 생성형 AI까지 합세한다면? 리버스 엔지니어링, 더 이상 두렵지 않습니다! 자, 시작해볼까요? 🚀


🛠️ 준비물

  1. 설치된 Ghidra: (아직 설치 안 하셨다면 이전 포스팅을 참고해주세요!)
  2. 분석 대상 파일 (hello.exe): C언어로 "Hello World"를 출력하는 아주 간단한 프로그램입니다.
  3. AI 챗봇: ChatGPT, Claude, Gemini 등 무엇이든 좋습니다.

💡 참고: 분석 대상 파일 만들기 혹시 C컴파일러(GCC, Visual Studio 등)가 있다면 아래 코드를 컴파일해서 hello.exe를 만들어보세요. 없다면 인터넷에 널려있는 아무 'Hello World exe' 파일을 구하셔도 좋습니다.

#include <stdio.h>

int main() { printf("Hello, AI Reversing World!\\n"); return 0; }

STEP 1. 기드라에 파일 먹이기 (Import) 📥

먼저 기드라를 실행하고 프로젝트를 하나 열어줍니다. (예: MyFirstReversing)

  1. 준비한 hello.exe 파일을 기드라 프로젝트 창으로 드래그 앤 드롭 합니다.
  2. 'Import' 창이 뜨면 별다른 설정 없이 [OK] 를 누릅니다.
  3. 프로젝트 리스트에 hello.exe가 추가된 것이 보일 겁니다. 더블 클릭해서 파일을 열어주세요.

(두근두근) 드디어 분석 화면 진입!

파일을 처음 열면 기드라가 묻습니다. "이 파일 분석할까요? (Analyze?)" 당연히 [Yes] 를 누르고, 기본 옵션 그대로 [Analyze] 버튼을 클릭해주세요. 기드라가 파일을 열심히 씹고 뜯고 맛보고 즐기기 시작합니다. 🍖


STEP 2. 외계어와 마주하기 (Listing 뷰 vs Decompiler 뷰) 👽

분석이 끝나면 화면에 뭔가 엄청나게 많은 정보가 뜹니다. 당황하지 마세요! 우리는 딱 두 곳만 보면 됩니다.

1. 리스팅(Listing) 뷰 (가운데 큰 화면)

여기는 '어셈블리어(Assembly)'의 세계입니다. PUSH, MOV, CALL 같은 기계어 명령들이 보입니다. 컴퓨터는 이 말을 이해하지만, 우리는... 음... 아직은 어렵습니다. 😅

2. 디컴파일러(Decompiler) 뷰 (보통 오른쪽 화면)

오늘의 주인공입니다! ✨ 기드라의 강력한 기능인 디컴파일러가 외계어 같은 어셈블리어를 우리가 익숙한 C언어 비슷한 형태(의사 코드, Pseudo-code) 로 바꿔 보여주는 곳입니다.


STEP 3. 메인(main) 함수 찾기 🕵️

프로그램이 시작되면 가장 먼저 실행되는 곳, 바로 main 함수를 찾아야 합니다.

  1. 기드라 좌측의 'Symbol Tree' 패널을 보세요.
  2. 'Exports' 또는 'Functions' 폴더를 열어봅니다.
  3. 운이 좋다면 main 이라는 이름이 떡하니 보일 겁니다. (안 보인다면 보통 entry나 WinMain 등을 찾아가다 보면 나오지만, 간단한 실습이니 main이 보인다고 가정합니다!)
  4. main을 더블 클릭하세요.

짜잔! 🎉 리스팅 뷰와 디컴파일러 뷰가 동시에 main 함수 위치로 이동합니다.


STEP 4. 내 코드 돌려내! (디컴파일 결과 확인) 👀

오른쪽 디컴파일러 뷰를 자세히 보세요. 아까 우리가 작성했던(또는 예상했던) C 소스코드와 비슷한가요?

// 기드라가 보여주는 디컴파일 코드 예시 (실제와 다를 수 있음)
int __cdecl main(int _Argc,char **_Argv,char **_Env)

{
  __main(); // 컴파일러가 추가한 초기화 함수
  puts("Hello, AI Reversing World!"); // printf가 puts로 최적화되기도 함
  return 0;
}

어? 조금 다릅니다.

  • printf를 썼는데 puts가 보이기도 하고요 (컴파일러가 최적화한 겁니다).
  • __main(); 같이 내가 안 짠 코드도 들어있고,
  • 함수 파라미터 이름도 _Argc 처럼 복잡해 보입니다.

원본 소스코드와 100% 똑같지는 않지만, "아, 이 코드가 문자열을 출력하고 종료하는구나"라는 핵심 로직은 파악할 수 있습니다. 이게 바로 리버스 엔지니어링의 핵심입니다!


STEP 5. AI에게 코드 구조 물어보기 (드디어 AI 등판! 🤖)

자, 코드가 너무 간단해서 시시한가요? 만약 코드가 조금만 더 복잡해지면 undefined4 uVar1; 같은 이상한 변수명들이 난무해서 알아보기가 힘듭니다.

이때 AI가 빛을 발합니다. 기드라가 보여준 디컴파일 코드를 AI에게 던져주고 해석을 시켜봅시다.

1. 코드 복사하기

디컴파일러 뷰에 있는 코드 전체를 드래그해서 복사(Ctrl+C)합니다.

2. AI에게 프롬프트 입력하기

여러분이 사용하는 AI 챗봇에게 가서 다음과 같이 물어보세요. (페르소나를 부여하면 더 잘 대답합니다!)

🧑‍💻 나의 프롬프트: "너는 지금부터 시니어 보안 분석가야. 내가 리버스 엔지니어링 도구(기드라)로 디컴파일한 C 코드를 줄 건데, 이 코드의 전체적인 구조와 어떤 역할을 하는지 초보자도 알기 쉽게 설명해 줄래?

(아까 복사한 코드를 여기에 붙여넣기)

 

3. AI의 답변 확인하기

AI가 뭐라고 대답할까요? 아마 이런 식으로 대답해 줄 겁니다.

🤖 AI의 답변 (예시): 네, 제시해주신 코드는 전형적인 C 프로그램의 진입점인 main 함수의 디컴파일 결과입니다.

코드 구조 및 역할 설명:

  1. 함수 정의 (main): 프로그램이 실행될 때 운영체제에 의해 가장 먼저 호출되는 메인 함수입니다. int형을 반환하며, 명령줄 인수(_Argc, _Argv)를 받고 있습니다.
  2. 초기화 루틴 (__main()): 실제 사용자 코드가 실행되기 전에 컴파일러가 삽입한 프로그램 초기화 관련 함수로 보입니다. 크게 신경 쓰지 않으셔도 됩니다.
  3. 핵심 기능 (문자열 출력):
    • puts("Hello, AI Reversing World!");
    • 이 부분이 가장 중요합니다. "Hello..." 라는 문자열을 화면(콘솔)에 출력하는 역할을 합니다. 원본 소스에서는 printf를 사용했더라도, 단순히 문자열만 출력할 경우 컴파일러가 더 빠른 puts 함수로 최적화(변경)하는 경우가 많습니다.
  4. 종료 (return 0;): 함수가 0을 반환하며 정상적으로 종료되었음을 운영체제에 알립니다.

요약: 이 프로그램은 실행 시 복잡한 로직 없이 "Hello, AI Reversing World!"라는 인사말을 출력하고 바로 종료되는 아주 간단한 구조를 가지고 있습니다.


🎉 실습을 마치며

어떠신가요? AI의 설명이 기가 막히지 않나요? 🤩

우리가 눈으로 대충 짐작했던 내용을 AI는 명확한 용어(진입점, 초기화 루틴, 최적화, 반환 값)를 사용해서 구조적으로 정리해 주었습니다.

오늘 실습을 통해 우리는 두 가지 큰 수확을 얻었습니다.

  1. 기계어의 세계를 살짝 엿보았다: 우리가 짠 예쁜 소스코드가 실제로는 이렇게 복잡하게 변한다는 것을 알았습니다.
  2. AI라는 강력한 조수를 얻었다: 앞으로 분석할 코드가 아무리 복잡하고 변수명이 iVar1, uVar2 처럼 엉망이어도, AI에게 물어보면 전체적인 숲을 볼 수 있다는 자신감을 얻었습니다.

다음 시간에는 이제 진짜 '분석' 다운 분석을 해볼 예정입니다. 코드를 조작해서 프로그램의 동작을 바꿔보는 '패치(Patch)' 실습을 준비해 올게요!

그때까지 오늘 배운 내용을 꼭 복습해 보세요! 안녕! 👋