반응형

Anti-Disassembly 로 많이 사용되는 EB FF 코드에 대해 간단히 살펴보자.

 

EB는 1바이트(-128 ~ +127) 이내 거리로 이동하는 Jump Short 명령이다.

위 그림에서 0x0040123F EB 03은 다음 명령어 주소(0x00401241)를 기준으로 03바이트 이동한 0x00401244로 이동한다.

 

EB 03을 EB FF로 바꿔보자.

FF는 -1을 의미하기 때문에 다음 명령어 주소 0x00401241에서 -1만큼 이동한 0x00401240으로 이동하라는 뜻이다. 그래서 화살표가 다른 곳을 가리키지 않고 명령어 자신을 가리키고 있다. (잘린것 처럼 보인다)

 

엔터키를 눌러 Jump 명령을 실행해 보면 EB FF 명령 중간인 FF의 위치, 0x00401240으로 이동한다.

 

※ 참고

ANTI-DISASSEMBLY TECHNIQUES

Assembly “wrapping”: a technique for anti-disassembly

 

반응형
Posted by J-sean
:
반응형

x32dbg/x64dbg를 JIT로 등록해 보자.

 

x32dbg를 관리자 권한으로 실행하고 Options - Preferences - Misc - Set x64dbg as Just In Time Debugger를 선택한다.

 

x32dbg/x64dbg를 다시 시작해야 적용된다.

 

#include <stdio.h>

int main()
{
	char* p = NULL;
	*p = 'A';

	return 0;
}

 

C0000005(EXCEPTION_ACCESS_VIOLATION) 예외가 발생하는 코드를 작성하고 빌드한다.

 

null.zip
0.04MB

 

 

빌드한 파일을 실행하면 예외가 발생하는 순간 멈추고 디버거가 실행된다.

 

0x001F1E20에서 [eax]가 가리키는 메모리 주소(0x00000000)에 0x41('A')을 복사하려 하고 있다.

 

반응형
Posted by J-sean
:
반응형

실행되는 명령들의 log를 남겨보자.

 

Trace into...나 Trace over...를 선택한다.

 

Log Text에 아래와 같은 포맷을 지정한다.

0x{p:cip} {i:cip}

Maximum trace count를 적당히 지정한다.

로그 파일의 이름이나 위치를 바꾸고 싶다면 Log File... 버튼을 클릭한다. (특별히 바꾸고 싶지 않아도 지정은 해줘야 한다. 그렇지 않으면 로그 파일이 생성되지 않는다)

 

지정된 숫자 만큼 명령이 실행되고 로그 파일이 생성된다.

 

※ 참고

Values

Expressions

String Formatting

 

반응형
Posted by J-sean
:
반응형

x64dbg에서 디버깅 중 Pause 명령이 실행되지 않는 경우가 있다.

 

F12 키를 누르면 에러가 발생한다.

 

Threads 탭을 확인해 보자.

 

현재 실행되고 있는 Thread가 Main이 아닌, 7번 14328이기 때문이다. 나머지 Thread는 Suspended 되어 있다.

 

Main 스레드에서 우클릭 - Switch Thread를 선택한다.

 

Pause는 Main 스레드에서만 사용할 수 있다. Main 스레드로 바꾸면 Pause를 사용할 수 있다.

 

반응형
Posted by J-sean
:
반응형

x64dbg와 Claude Desktop, Gemini CLI를 사용해 보자.

 

x64dbgMCP를 다운로드한다.

 

MCPx64dbg.dp64와 x64dbg.py를 x64dbg 플러그인 폴더에 복사한다.

 

x64dbg를 실행하고 Log 윈도우를 확인하면 MCPx64dbg 플러그인이 로드되어 있다.

 

{
  "mcpServers": {
      "ghidra": {
        "command": "python",
        "args": [
          "D:\\ProgramFiles\\ghidra\\bridge_mcp_ghidra.py",
          "--ghidra-server",
          "http://127.0.0.1:8080/"
        ]
      },
      "x64dbg": {
        "command": "Python",
        "args": [
          "D:\\Program Files\\x64dbg\\release\\x64\\plugins\\x64dbg.py"
        ]
      }
  }
}

 

claude_desktop_config.json 파일에 x64dbg 내용을 추가한다.

 

클로드를 실행하면 x64dbg 로컬 MCP 서버가 실행되어 있다.

 

x64dbg에서 디버깅을 시작한다.

 

 

Claude에서 질문을 하면 답을 찾아간다.

 

근거 있는 답변을 제시한다.

 

질문 내용에 따라 Ghidra와 x64dbg를 구분하지 못하는 경우가 있다.

 

 

{
  "selectedAuthType": "oauth-personal",
  "theme": "Default",
  "mcpServers": {
      "ghidra-mcp": {
        "command": "python",
        "args": [
          "D:\\ProgramFiles\\ghidra\\bridge_mcp_ghidra.py",
          "--ghidra-server",
          "http://127.0.0.1:8080/"
        ]
      },
      "x64dbg": {
        "command": "Python",
        "args": [
          "D:\\Program Files\\x64dbg\\release\\x64\\plugins\\x64dbg.py"
        ]
      }
  }
}

 

Gemini CLI 설정 파일 settings.json에 x64dbg MCP Server 내용을 위와 같이 추가한다.

 

Gemini를 실행하면 2개의 MCP Server(Ghidra, x64dbg)가 실행되고 있다고 표시된다.

 

실행되고 있는 x64dbg에 대한 질문을 할 수 있다.

 

질문 내용에 따라 Ghidra와 x64dbg를 구분하지 못하는 경우가 있다.

 

반응형
Posted by J-sean
:
반응형

GhidraMCP와 클로드, 제미나이 CLI를 사용해 보자.

 

Claude에 가입하고 Claude Desktop을 설치한다.

GhidraMCP를 다운로드하고 압축을 푼다. 압축을 풀면 아래와 같은 2개의 파일이 나온다.

 - GhidraMCP-(version).zip

 - bridge_mcp_ghidra.py

이 중 bridge_mcp_ghidra.py 파일은 Ghidra 설치 폴더에 복사한다. (예: D:\ProgramFiles\ghidra)

 

File - Install Extensions 를 선택한다.

 

오른쪽 상단의 + 버튼을 클릭하고 GhidraMCP-(version).zip을 선택한 후 체크 표시가 되면 OK를 클릭한다. 그리고 Ghidra를 다시 실행한다.

 

CodeBrowser에서 File - Configure를 선택한다.

 

Developer - Configure - GhidraMCPPlugin이 체크되어 있는지 확인한다.

 

 

Claude - 파일 - 설정을 클릭한다.

 

개발자 - 구성 편집을 클릭한다.

 

Claude 폴더 - claude_desktop_config.json 파일을 아래 코드와 같이 편집한다.

 

{
  "mcpServers": {
    "ghidra": {
      "command": "python",
      "args": [
        "D:\\ProgramFiles\\ghidra\\bridge_mcp_ghidra.py",
        "--ghidra-server",
        "http://127.0.0.1:8080/"
      ]
    }
  }
}

 

위에서 Ghidra 설치 폴더로 복사해 둔 bridge_mcp_ghidra.py 의 경로 D:\ProgramFiles\ghidra 표현 시 역슬래시 2개를 사용하는것에 주의한다.

 

 

Claude - 파일 - 종료를 선택해 종료하고 Claude를 다시 실행한다. 오른쪽 상단 X 버튼을 클릭해 종료하면 진짜 종료되지 않는다.

 

Claude를 다시 실행해 보면 로컬 MCP 서버가 실행되고 있다.

 

다시 첫 화면으로 돌아와 검색 및 도구 버튼을 클릭하면 ghidra가 활성화 되어 있다.

 

Ghidra로 원하는 프로그램을 분석하다가 FUN_00401130 함수의 역할이 궁금해졌다고 가정하자.

 

 

원하는 함수를 분석해 결과를 알려준다.

 

변수 이름을 알기쉽게 바꿔 달라고 요청해 본다.

 

변수 이름 뿐만 아니라 함수 이름까지 적당히 바꿔서 결과를 출력해 준다.

 

함수 위치에서 대충 질문해도 알아서 잘 답해준다.

 

 

Gemini-CLI를 설치한다.

 

Gemini CLI의 세팅 파일은 settings.json이다.

 

{
  "selectedAuthType": "oauth-personal",
  "theme": "Default",
  "mcpServers": {
    "ghidra-mcp": {
      "command": "python",
      "args": [
        "D:\\ProgramFiles\\ghidra\\bridge_mcp_ghidra.py",
        "--ghidra-server",
        "http://127.0.0.1:8080/"
      ]
    }
  }
}

 

settings.json을 위와 같이 작성한다.

 

Gemini CLI를 실행하면 위와 같이 1개의 MCP server가 사용되고 있음이 표시된다.

 

Ctrl+t 키를 누르면 사용 가능한 툴이 표시된다.

 

Ghidra에서 분석을 진행하다 궁금한게 있다면 질문하고 답변을 받을 수 있다.

 

반응형
Posted by J-sean
:
반응형

윈도우 API 함수 파라미터를 분석해 보자.

 

Ghidra의 경우 Analysis - WindowsPE x86 Propagate External Parameters 를 선택한다.

파일을 처음 임포트해서 분석할 때 옵션에서 선택할 수도 있다.

 

함수의 매개변수가 주석으로 표시된다.

 

디컴파일러 윈도우에도 동일한 내용이 표시된다.

 

x32dbg/x64dbg의 경우 xAnalyzer를 설치하고 우클릭 - xAnalyzer - Analyze function을 선택한다.

xAnalyzer Link

 

Ghidra 보다 보기 좋게 표시된다.

 

반응형
Posted by J-sean
:
반응형

실행 파일에서 원하는 리소스를 찾아보자.

 

ImagePrc.zip
0.12MB

 

 

 

ImagePrc.exe 를 x32dbg - xAnalyzer로 분석하면 위와 같이 FindResourceA 함수에서 두 번째 인수인 리소스 이름으로 65를 사용한 것을 확인할 수 있다. FindResourceA 함수의 두 번째 인수는 포인터가 아닐 경우 MAKEINTRESOURCE(ID) 이다.

 

 

PE를 분석하면 Resource ID가 65인 데이터를 찾을 수 있다.

 

반응형
Posted by J-sean
: