Vibe Reversing: Ghidra에 MCP 서버 붙이기
GhidraMCP로 바이브 리버싱
CTF 라이트업 읽다가 요즘은 IDA에 MCP 플러그인 껴서 리버싱할 수 있다길래 나중에 해봐야지 하고 있었다
근데 이번에 CCE 끝나고 디코 보니까 많은 사람들이 그렇게 하고 있는 것 같았다
얼마나 좋길래 이렇게 많이 쓰는지 궁금해서 이번에 해봤다..
이 글도 별로 영양가는 없지만 궁금한 사람들은 읽어보면 좋을 것 같다
요즘 챗지피티든 제미나이든 AI 성능이 급속도로 성장하고 있다
개인적으로 제미나이보단 챗지피티가 더 똑똑하게 느껴지지만 둘 다 성능 좋은 AI인 건 자명하다
리버싱 문제를 풀다보면 심볼 이름이 sub_431074
, sub_43107C
이딴 식으로 나와서 라벨링 없이는 헷갈려서 풀기 힘든 경우가 많다..
근데 이걸 그대로 LLM에 가져가면 지혼자 동작 분석하고 다음으로는 어느 함수 봐야하는지 알려주니까 이만큼 기특할 수가 없다
공부하고 문제 풀면서 뗄레야 뗄 수 없는 AI인데 말로만 도움을 주던 AI에게 인간이 사용하는 도구를 쥐어준다면 AI의 역할은 훨씬 더 확장될 수 밖에 없다
나는 IDA가 무료 버전이기 때문에 GhidraMCP를 사용했다
기존에는 내가 Ghidra에 바이너리 올리고 디스어셈블한 코드를 AI에게 주고 분석시켰는데 이제는 AI가 직접 Ghidra를 사용하여 디스어셈블하며 분석할 수 있는 것이다
설치 및 적용 방법은 링크에 설명되어있긴 하나 간략하게 설명하고 넘어가겠다
Ghidra 설정
Ghidra 실행 후 Tools > Install Extensions에 GhidraMCP 압축 파일을 선택해 집어넣는다
후에 Ghidra를 재시작하면 적용된다
Add Extension 플러스 버튼이 비활성화되서 안 눌리는 경우가 있는데 Ghidra를 최신 버전으로 업데이트하면 해결된다
File > Configure > Developer 체크박스에 체크한다
기본 설정은 체크가 되어 있지 않은 것 같다
후에 Developer - Congigure에서 GhidraMCPPlugin이 체크되어 있는지 확인한다
Edit > Tool Options > GhidraMCP HTTP Server에서 사용할 포트 주소를 설정한다
기본값으로 둬도 되고 겹치는 사용 중인 포트가 있다면 다른 걸로 바꿔주면 된담
MCP 클라이언트 설정
깃허브에는 Cloude, Cline, 5ire 세 개의 예시가 있다
본인은 Cline이 간단해 보이길래 Cline을 사용해서 해봤다
사실 MCP라는 개념을 제대로 모르고 있기도 했고 이번에 처음 해보는 거라 다른 클라이언트는 어떻게 쓰는지 모른다
1
python bridge_mcp_ghidra.py --transport sse --mcp-host 127.0.0.1 --mcp-port 5556 --ghidra-server http://127.0.0.1:5555/
서버 실행 명령어인데 본인은 로컬에서 돌렸기 때문에 루프백 주소를 사용했다
Ghidra에서 설정한 서버 포트에 맞게 수정해서 사용해야 한다
서버 이름은 사실 뭘로 해도 상관 없을 것 같고 Server URL만 제대로 설정해주면 된다
아까 파이썬 명령어 입력할 때 --mcp-port
옵션으로 주었던 포트 사용해서 MCP 서버 주소에 /sse
붙여서 넣어주면 된다
이렇게 AI가 사용할 수 있는 도구들이 나오면 제대로 연결된 것이다
바이브 리버싱
사용할 API를 선택하고 토큰을 줘야 한다..;;
나는 돈 없는 가난한 학생이라 제미나이에서 무료 API 주길래 그걸로 해봤다..
Ollama도 되니까 본인 서버나 로컬 컴퓨터 사양이 좀 된다면 로컬에서 모델 돌리면 편할 것 같다
대충 프롬프트 짜서 올리고 진행하면 Approve/Reject 이런 버튼이 나온다
Cline이 GhidraMCP 툴을 사용하여 FUN_0040a490
함수의 참조 리스트를 찾아도 되냐고 묻는 것이다
Approve로 진행하도록 해도 되고 Reject로 거절하고 다른 요청을 해도 좋다
참고로, Auto-approve를 설정할 수도 있는데 Enabled와 Read만 설정하는 것을 추천한다..
Edit 설정했다가 지가 원하는 툴 없다고 bridge_mcp_ghidra.py
파일을 수정했는데 지 맘대로 도구 만들어놓고 안 된다고 무한 에러를 한번 띄운 적이 있어서 그 이후로는 절대 안 쓴다;;
Approve를 선택해봤는데 해당 함수를 참조하는 곳이 없다고 한다
이러면 자기 혼자서 알아서 다음 할 동작을 생각하고 다음 동작을 해도 되는지 물어본다
이런 식으로 같이 분석하고 필요하면 자동 분석을 돌려도 되는 것이다
성능
Suninatas 11번 문제를 바이브 리버싱으로 풀어보기로 했다
쉬운 난이도의 문제임에도 불구하고 뚱딴지 같은 소리를 해대며 엉뚱한 정답을 낸 모습이다..
일단 이런 결과가 나온 원인에는 여러 가지가 있긴 할 것이다
API 가격 이슈
구글에서 무료로 API를 제공해주지만 속도 제한이 심해서 요청을 하나 보내면 너무 많은 요청이라고 에러가 떠서 중간중간 시간텀을 두어야 한다..
속도 제한에 대한 내용은 여기서 확인할 수 있다
속도를 조금 높이려면 낮은 버전의 모델을 사용해야 한다
하지만 이러면 답변 퀄리티는 낮아질 수 밖에 없다
예전에 챗지피티 결제가 돈이 아깝다 생각해서 유료 플랜 안 사고 세종 핵테온 풀다가 무료 토큰 끊기니까 안 풀리길래 한번 결제해봤던 적이 있다
지금은 왜 이제껏 유료 플랜을 사용하지 않았을까 생각하며 매우 만족스럽게 사용하고 있다
아마 이것도 이러지 않을까 싶다
어차피 사용량 맞춰서 가격 정해지는 거기 때문에 결제해도 후회는 없을 것 같긴 하다
좋은 모델 쓰면 풀 수 있을 것 같기도 하고..
프롬프트 이슈
내가 사용한 프롬프트는 지피티가 짜준 프롬프트를 약간 수정한 것이다
아무리 나보다 똑똑한 지피티라지만 MCP 서버가 제대로 리버싱을 할 수 있도록 분석 방향이나 바이너리 정보들을 제공해주어야 제대로 분석이 가능하다
나는 노베이스 상태로 분석을 시켰기 때문에 중간중간 혼동도 많았고 문제 해결 방향도 이상하게 흘러갔다
결국 잘못된 방향으로 분석을 하다보니 정답도 엉뚱한 값이 된 것이다
모델의 문제도 있겠지만 옛날 지피티로도 리버싱을 잘만 했듯이 프롬프트를 더 잘 깎으면 낮은 모델로도 충분히 풀 수 있었을 것이라 생각된다
사실 이건 100% AI가 한번에 풀어주기를 바라는 쌀먹 마인드로 내가 임해서 그런 것이지 내가 할 수 있는 건 하면서 AI를 조수 느낌으로 사용해야 한다
내가 요청했던 해당 문제는 델파이 바이너리였는데 Ghidra에서 심볼 이름을 못 읽어냈다
때문에 이 바이너리가 뭔지 이 함수가 뭔 역할인지 그냥 봐서는 도통 알 수가 없어서 MCP가 헤맸던 것인데 IDR로 메타데이터 덮어씌워서 심볼 이름 바꿔주고 델파이 바이너리임을 명시해주고 한다면 잘 풀 수 있지 않을까 싶다
MCP 이슈
MCP서버 코드를 보면 사용할 수 있는 툴이 그리 많지가 않다
기본적인 동작만 수행해서 Ghidra를 자유롭게 조작하지는 못한다
근데 사실 이러면 지피티에 프로젝트 만들고 거기서 복붙해가면서 하는게 조금 귀찮더라도 풀리긴 할 것 같다
툴이 너무 제한적이어서 할 수 있는게 많이 없다
성능 최적화
프롬프트도 좀 깎고 모델 버전도 높여봤더니 그래도 정답에 근접한 정답을 내놨다
근데 이건 진짜 MCP 툴의 한계로 못 푼 거라 무조건적으로 사용자가 개입해야 한다
아직 AI가 모든 걸 할 정도의 수준은 아닌 것 같다
솔직히 말해서 개인적으로 제미나이를 별로 안 좋아하기도 하고 그냥 챗지피티 복붙이 더 나은 것 같다
근데 또 모른다
툴에 심볼 라벨링 시키는 기능도 있으니까 충분히 활용하면 리버싱에 소요되는 시간을 획기적으로 줄일 수 있을 것 같다
아무래도 지혼자 함수 와리가리 하면서 라벨링 다 해주고 나면 라벨링 참고해서 난 분석만 하면 되니까..
우리 모두 바이브 리버싱으로 짱짱해커가 되어보자
아마 내가 군대 다녀오면 하늘에 자동차도 날아댕기고 리버싱도 AI로 뚝딱 가능한 시대가 되지 않을까
듣기로는 챗지피티 등장 이후로 CTF 난이도가 상향 평준화되었다는 얘기도 있던데..