Gemini CLI 로 Ghidra MCP 사용하는 방법

Gemini CLI 로 Ghidra MCP 사용하는 방법

예전에 Gemini AI 를 이용한 악성코드 분석 이라는 글을 작성해 Ghidra 스크립트를 이용해 디컴파일된 코드, 바이너리 코드, 데이터, 등을 추출한 후, Gemini 에 업로드하여 분석을 요청하는 방법에 대해 다룬 적이 있었다. 이 방식은 여러 문제점이 있었는데 대표적인 것이 input 데이터의 크기가 너무 크면 Gemini 에서 이를 처리하지 못한다는 점이었다. 또한 업로드가 가능한 수준의 데이터를 올려도 Gemini 가 너무 정보가 많다고 판단하는지 존재하지도 않는 주소의 함수를 해석하는 등, 환각 증상이 발생했었다.

해당 글을 작성할 당시, 문제의 근본적인 원인은 내가 제공하는 데이터가 지나치게 많기 때문이니 단일 분석에 필요한 데이터만 제공한다면 환각 증세를 완화할 수 있다고 생각했다. 실제로 개별 함수에 대한 디컴파일된 코드, 바이너리 코드와 필요한 데이터만 제공했을 때는 환각 증세가 거의 없었다. 하지만 수 없이 많은 함수를 매번 이런 식으로 처리할 순 없다. 너무 귀찮다.

해결책을 찾던 와중 ghidraMCP 라는 프로젝트를 Github 에서 발견하여 이 문제를 해결할 수 있다고 판단했다. 이 프로젝트는 LLM 과 통신할 수 있는 Ghidra MCP 서버를 생성하여 분석을 자동화할 수 있다. 해당 프로젝트에서는 Claude, Cline 에 대한 예제만을 다루고 있으나 Gemini CLI 도 제공되는 MCP 기능을 이용해 이 프로젝트를 사용할 수 있다.

이 글은 Host 시스템이 Windows OS 라 가정하고 작성했다.

ghidraMCP 로고

1. 선행 설치 프로그램

ghidraMCP 프로젝트에는 아래와 같이 사용하기 전 선행 설치되어야 하는 프로그램에 대해 명시하고 있다.

  • Ghidra
  • Python3
  • MCP SDK
    각 프로그램을 설치하는 방법에 대해 자세히 다루진 않겠다. 이 글의 본래 목적에서 벗어나며, 시간이 지나면 설치하는 방법이 바뀔 수도 있기 때문이다. 대신 Ghidra 와 MCP SDK 에 대해 짧게 언급하겠다.
  • Ghidra : JDK 21 64-bit 설치 필요.
  • MCP SDK : pip install "mcp[cli]" 로 간단히 의존성 설치 가능.

2. 설정

2.1 Ghidra 설정

ghidraMCP 의 release 페이지에서 빌드된 파일을 다운로드 할 수 있다. 최신 버전의 릴리즈 ZIP 파일을 다운로드하자.

ghidraMCP 프로젝트의 release 페이지

ZIP 파일을 압축 해제하면 bridge_mcp_ghidra.py 파일과 GhidraMCP-{버전}.zip 파일이 있다. bridge_mcp_ghidra.py 파일은 Ghidra 폴더에 복사한다.

ghidra 폴더에 bridge_mcp_ghidra.py 파일을 복사한 모습

이제 Ghidra 에 ghidraMCP 확장 프로그램을 설치해야 한다. Ghidra 실행 후 File - Install Extensions 를 클릭하여 확장 프로그램 설치 창을 팝업시킨다. 팝업된 창 우측 상단의 + 버튼을 클릭하면 설치할 확장 프로그램을 선택할 수 있다. 앞서 다운로드한 GhidraMCP-{버전}.zip 파일을 선택하자. 정상적으로 설치되면 아래 이미지처럼 GhidraMCP 가 목록에 나타난다.이 확장 프로그램은 Ghidra 를 다시 시작해야 적용되니, 프로그램을 종료하고 다시 실행한다.

Install Exntesions 창

이후 CodeBrowser 에서 제대로 설치가 되었는지 확인해야 한다. 분석할 샘플을 더블 클릭하거나 용 아이콘을 클릭해 CodeBrowser 를 실행 후, File - Configure 메뉴를 선택하면 Configure Tool 창을 팝업시킬 수 있다.

Configure Tool 창

Developer 하단의 Configure 를 클릭하면 설치된 개발자 플러그인을 확인할 수 있다. 아래 이미지와 같이 GhidraMCPPlugin 에 체크가 되어 있는지 확인한다.

Configure Developer Plugins

2.2 Gemini CLI 설정

Gemini CLI 설치 후, CLI 에서 MCP 서버를 인식할 수 있도록 설정해야 한다. Gemini CLI 의 문서에서 MCP 서버를 설정하는 방법에 대해 자세히 다루고 있다.

%USERPROFILE%\.gemini\settings.json 파일에는 Gemini CLI 관련 설정들이 json 포맷으로 저장되어 있다. 기존의 설정 값에서 아래와 같이 mcpServersghidra-mcp 를 실행할 때 사용되는 인자에 대한 정보를 작성한다.

args 에는 bridge_mcp_ghidra.py 파일의 경로와 MCP 서버의 바인딩 주소를 설정한다. 기본 Port 번호는 8080이지만 필요하다면 적절하게 변경해야 한다. 다음은 settings.json 파일 예시다.

{
  "mcpServers": {
    "ghidra-mcp": {
      "command": "python",
      "args": [
        "C:\\Users\\{사용자}\\Downloads\\ghidra_11.4.2_PUBLIC_20250826\\ghidra_11.4.2_PUBLIC\\bridge_mcp_ghidra.py",
        "--ghidra-server",
        "http://127.0.0.1:8080/"
      ]
    }
  }
}

2.3 Port 변경 (optional)

ghidraMCP 서버는 기본적으로 8080번 포트를 사용하도록 설정되어 있다. 만약 서버에 바인딩되는 포트를 변경하고 싶다면 몇 가지 내용을 수정해야 한다.

사용하는 포트를 8085번으로 변경한다고 가정하자.

Gemini CLI 의 settings.json 파일 내 args 필드 값. MCP 서버 실행 시 바인딩되는 포트 번호가 명시되어 있다. 이 값을 8085번 포트로 변경한다.

{
  "mcpServers": {
    "ghidra-mcp": {
      "command": "python",
      "args": [
        "C:\\Users\\{사용자}\\Downloads\\ghidra_11.4.2_PUBLIC_20250826\\ghidra_11.4.2_PUBLIC\\bridge_mcp_ghidra.py",
        "--ghidra-server",
        "http://127.0.0.1:8085/"
      ]
    }
  }
}

다음은 Ghidra 설정을 변경해야 한다. Ghidra 실행 후, CodeBrowser 에서 Edit - Tool Options 메뉴를 선택하면 GhidraMCP HTTP Server 를 발견할 수 있다. Server Port 값을 적절하게 설정하자.

Options for CodeBrowser 창

만약 MCP 서버가 제대로 실행되고 있다면 브라우저로 해당 포트로 접속했을 때 404 Not Found 페이지가 출력된다. 만약 MCP 서버가 실행되지 않고 있다면 연결이 Reset 되거나 Refuse 된다.

MCP 서버 정상 작동 시 404 Not Found 페이지 출력

3. 사용법

Gemini CLI 를 통해 MCP 를 사용하는 것이므로 기본적으로 Gemini CLI 사용법에 대해 익혀야 한다.

관리자 권한으로 PowerShell 을 실행한 후 gemini 명령어로 실행할 수 있다. 처음 사용한다면 사용자 인증이 필요할 수 있다.

Gemini CLI 시작 화면

ghidraMCP 가 적절하게 인식되었다면 /mcp list 명령어를 사용해 ghidra-mcp 에서 제공하는 툴 목록을 확인할 수 있다.

/mcp list 명령어 실행 결과

이제 Ghidra CodeBrowser 를 킨 채 분석하며 Gemini 에게 궁금한 것들을 물어보면 된다. 처음 세션을 시작한다면 MCP 툴을 사용해도 되는지 허락을 구한다. 여러 번 툴을 사용해야 하니 가급적 3번을 선택하자.

ghidra-mcp 실행 권한 요청 화면

제대로 작동한다면 Gemini 가 MCP 서버와 통신하며 분석한 결과를 출력한다. 만약 연결에 실패하면 MCP 서버가 정상 동작하지 않고 있을 가능성이 높으니 앞선 과정의 설정을 다시 한번 확인해보자.

Gemini CLI 의 분석 결과

가장 중요한 점 중 하나는 저장하지 않은 내용은 PowerShell 을 닫으면 즉시 날아가버리니 /chat save 명령어로 자주 저장해야 한다는 것이다. 저장된 파일C:\Users\<사용자>\.gemini\tmp\<project_hash> 폴더에 checkpoint-{chat 이름}.json 형태로 저장된다.

/chat 명령어 옵션 목록

저장된 채팅 내용을 불러올 때는 /chat resume <채팅 이름> 명령어를 사용한다.

4. 사용 후기

4.1 장점

실제 사용감을 체험하기 위해 악성 exe 파일 중 하나를 선정하고 간단하게 분석을 진행해보았다. 분석 도중 악성 샘플에서 암호화된 문자열을 복호화하고 사용한다는 점을 알게되어 구체적으로 어떤 알고리즘을 사용하고 있는지 Gemini 에게 물어보았다. 내가 대강 분석했을 때는 무언가의 연산 + Base64 디코딩 방식을 사용하고 있었는데, Gemini 는 무언가의 연산이 비즈네르 암호화 방식임을 정확히 캐치해냈다.

비즈네르 암호 코드 분석 결과

필자는 비즈네르 암호라는 용어 자체를 처음 들어봐 구글링해보니, 악성 샘플에 적용된 연산은 알려진 비즈네르 암호화와는 약간 차이가 있었다. 이 점에 대해 Gemini 에게 물어보니 아래와 같이 친절하게 커스터마이징된 알고리즘임을 설명해주었다.

커스터마이징된 비즈네르 암호 코드 분석 결과

4.2 아쉬운 점

최대 단점은 API 를 사용하는 방식이기 때문에 많건 적건 사용량에 비례하여 요금을 지불해야 한다는 점이다. 부담스러운 수준은 아니지만 무형의 서비스에 과금한다는 사실에 저항감이 있는 사람이라면 큰 허들이 될 수 있다.

그 외에도 여전히 환각이 심하다는 점이다. 앞서 언급한 문자열 복호화를 Gemini 에게 시켜봤는데 실패했다. 적어도 잘 모르겠다고 답했다면 그러려니 하겠지만, 틀린 답을 너무도 당당하게 말하니 중요한 일을 맡기기엔 부담스럽다.

Gemini CLI 가 문자열 복호화에 실패한 모습