안녕하세요! 보안 꿈나무 여러분 🌱
지난 시간에 우리는 강력한 무료 리버스 엔지니어링 도구인 기드라(Ghidra) 설치를 마쳤습니다. 도구를 설치했으면 이제 써봐야겠죠?
하지만 처음부터 거창한 악성코드를 분석하려고 하면 머리만 아프고 금방 지쳐버립니다. 🤯 그래서 오늘은 가장 기초적이지만 가장 중요한 첫걸음, "Hello World" 프로그램을 분석해 볼 거예요.
"에이, Hello World는 그냥 출력만 하는 거잖아요?" 라고 생각하시나요? 네, 맞습니다! 하지만 '우리가 아는 소스코드'가 '컴퓨터가 이해하는 기계어'로 바뀌고, 그걸 다시 '우리가 알아볼 수 있게 복원(디컴파일)'하는 과정을 이해하는 데 이만한 예제가 없습니다.
여기에 우리의 든든한 지원군 생성형 AI까지 합세한다면? 리버스 엔지니어링, 더 이상 두렵지 않습니다! 자, 시작해볼까요? 🚀

🛠️ 준비물
- 설치된 Ghidra: (아직 설치 안 하셨다면 이전 포스팅을 참고해주세요!)
- 분석 대상 파일 (hello.exe): C언어로 "Hello World"를 출력하는 아주 간단한 프로그램입니다.
- 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)
- 준비한 hello.exe 파일을 기드라 프로젝트 창으로 드래그 앤 드롭 합니다.
- 'Import' 창이 뜨면 별다른 설정 없이 [OK] 를 누릅니다.
- 프로젝트 리스트에 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 함수를 찾아야 합니다.
- 기드라 좌측의 'Symbol Tree' 패널을 보세요.
- 'Exports' 또는 'Functions' 폴더를 열어봅니다.
- 운이 좋다면 main 이라는 이름이 떡하니 보일 겁니다. (안 보인다면 보통 entry나 WinMain 등을 찾아가다 보면 나오지만, 간단한 실습이니 main이 보인다고 가정합니다!)
- 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 함수의 디컴파일 결과입니다.
코드 구조 및 역할 설명:
- 함수 정의 (main): 프로그램이 실행될 때 운영체제에 의해 가장 먼저 호출되는 메인 함수입니다. int형을 반환하며, 명령줄 인수(_Argc, _Argv)를 받고 있습니다.
- 초기화 루틴 (__main()): 실제 사용자 코드가 실행되기 전에 컴파일러가 삽입한 프로그램 초기화 관련 함수로 보입니다. 크게 신경 쓰지 않으셔도 됩니다.
- 핵심 기능 (문자열 출력):
- puts("Hello, AI Reversing World!");
- 이 부분이 가장 중요합니다. "Hello..." 라는 문자열을 화면(콘솔)에 출력하는 역할을 합니다. 원본 소스에서는 printf를 사용했더라도, 단순히 문자열만 출력할 경우 컴파일러가 더 빠른 puts 함수로 최적화(변경)하는 경우가 많습니다.
- 종료 (return 0;): 함수가 0을 반환하며 정상적으로 종료되었음을 운영체제에 알립니다.
요약: 이 프로그램은 실행 시 복잡한 로직 없이 "Hello, AI Reversing World!"라는 인사말을 출력하고 바로 종료되는 아주 간단한 구조를 가지고 있습니다.
🎉 실습을 마치며
어떠신가요? AI의 설명이 기가 막히지 않나요? 🤩
우리가 눈으로 대충 짐작했던 내용을 AI는 명확한 용어(진입점, 초기화 루틴, 최적화, 반환 값)를 사용해서 구조적으로 정리해 주었습니다.
오늘 실습을 통해 우리는 두 가지 큰 수확을 얻었습니다.
- 기계어의 세계를 살짝 엿보았다: 우리가 짠 예쁜 소스코드가 실제로는 이렇게 복잡하게 변한다는 것을 알았습니다.
- AI라는 강력한 조수를 얻었다: 앞으로 분석할 코드가 아무리 복잡하고 변수명이 iVar1, uVar2 처럼 엉망이어도, AI에게 물어보면 전체적인 숲을 볼 수 있다는 자신감을 얻었습니다.
다음 시간에는 이제 진짜 '분석' 다운 분석을 해볼 예정입니다. 코드를 조작해서 프로그램의 동작을 바꿔보는 '패치(Patch)' 실습을 준비해 올게요!
그때까지 오늘 배운 내용을 꼭 복습해 보세요! 안녕! 👋
'일반IT > IT보안' 카테고리의 다른 글
| [실습] 복잡한 함수도 3초 컷? ⏱️ 기드라(Ghidra)로 추출하고 AI로 요약하는 실전 분석 루틴! (0) | 2025.12.11 |
|---|---|
| [실습] AI에게 "제대로" 질문하는 법! 🗣️ 악성코드 분석을 위한 프롬프트 엔지니어링 A to Z (0) | 2025.12.11 |
| [보안 스터디] 악성코드 분석, 이제 AI랑 같이 하자! 🤖 (Ghidra + ChatGPT 환경 구축 가이드) (0) | 2025.12.11 |
| 🚨 [속보] 2025년 11월, 드디어 공개된 'OWASP Top 10 2025' 완벽 분석! (0) | 2025.12.11 |
| [Windows Security] 윈도우 일반 유저(Domain User)의 권한, 정말 '아무것도' 못할까? (Default Deny의 오해와 진실) (0) | 2025.11.23 |