swuforce

[워게임 공부]Inject me!!!

범호야 2025. 5. 20. 15:45

문제를 풀 때 사용했던 코드를 분석해보자

#include "stdio.h"
#include "windows.h"
#include "conio.h"


- stdio.h: 표준 입출력 함수들 (예: printf) 사용
- windows.h: Windows API (예: LoadLibrary, FreeLibrary) 사용
- conio.h: 콘솔 입출력 관련 함수 (_getch 등)

 

void main() {
    HMODULE hDll = NULL;


- HMODULE: Windows에서 모듈(DLL)의 핸들을 저장하는 타입
- hDll = NULL;: 처음에는 아무 DLL도 로드하지 않은 상태

 

hDll = LoadLibraryA("prob_rev.dll");
- "prob_rev.dll" 파일을 현재 경로 또는 시스템 경로에서 찾아 메모리에 로드
- ANSI 버전 함수 사용 (LoadLibraryA), 유니코드는 LoadLibrary

 

if (hDll == NULL) {
        printf("Failed to load dll");
        return;
    }

 
- 로드에 실패했다면 (예: 파일이 없거나 오류 발생 시),
- 에러 메시지를 출력하고 프로그램 종료


    printf("Success to load library");
    while (_getch() != 'q');


- DLL을 성공적으로 로드한 경우 메시지 출력
- q 키를 누를 때까지 대기 (콘솔 유지)

 

    FreeLibrary(hDll);
}
- 사용이 끝난 DLL을 메모리에서 해제
- 리소스 누수 방지

 

-> 위와 비슷한 코드가 DLL 후킹 테스트, 리버스 엔지니어링, 디버깅 등의 목적으로 주로 사용된다. 

 

dll 파일이란?

DLL(Dynamic Link Library) 파일은 동적 연결 라이브러리 파일로, Windows 운영 체제에서 사용하는 실행 파일 형식 중 하나

DLL 파일은 .exe 파일과 유사한 구조를 가지지만, 단독으로 실행되지는 않는다. 대신, 다른 실행 파일이나 DLL 파일에 의해 호출되어 기능을 제공한다. DLL 파일은 다음과 같은 구조적 요소로 구성된다:

  • 헤더(Header): 파일의 시작 부분에 위치하며, 파일 형식과 구조에 대한 정보를 포함한다.
  • 데이터 디렉터리(Data Directory): 데이터 및 코드 세그먼트의 위치를 나타내는 테이블이다.
  • 코드 세그먼트(Code Segment): 실행 가능한 코드가 포함된 부분이다.
  • 데이터 세그먼트(Data Segment): 전역 변수와 상수 데이터가 저장된 부분이다.
  • 수정할 수 있는 데이터(Mutable Data): 런타임에 변경 가능한 데이터이다.

DLL 파일이 로드되면, 운영 체제는 해당 DLL 파일의 함수를 호출할 수 있도록 메모리에 매핑한다. 이 과정은 보통 **로드 타임 로딩(load-time loading)**과 **런타임 로딩(run-time loading)**으로 나뉜다. 로드 타임 로딩은 응용 프로그램이 시작될 때 DLL 파일을 메모리에 로드하는 방식이고, 런타임 로딩은 응용 프로그램이 실행 중일 때 필요에 따라 DLL 파일을 로드하는 방식이다.