
ret-sync는 디버깅 세션(WinDbg/GDB/LLDB/OllyDbg2/x64dbg)을 IDA/Ghidra/Binary Ninja 디스어셈블러와 동기화하는 데 도움이 되는 플러그인 세트입니다.
ret-sync는 Reverse-Engineering Tools SYNChronization을 의미합니다. 이는 디버깅 세션(WinDbg/GDB/LLDB/OllyDbg/OllyDbg2/x64dbg)을 디스어셈블러(IDA/Ghidra/Binary Ninja)와 동기화하는 데 도움이 되는 플러그인 모음입니다. 기본 아이디어는 간단합니다. 두 세계(정적 분석과 동적 분석)의 장점을 취하는 것입니다.
디버거와 동적 분석은 다음을 제공합니다:
!peb, !drvobj, !address 등)디스어셈블러와 정적 분석은 다음을 제공합니다:
주요 기능:
ret-sync는 제가 Quarkslab에 근무할 때 개발하고 유지 관리한 qb-sync의 포크입니다.
디버거 플러그인:
ext_windbg/sync: WinDbg 확장 소스 파일, 빌드 시: sync.dllext_gdb/sync.py: GDB 플러그인ext_lldb/sync.py: LLDB 플러그인ext_olly1: OllyDbg 1.10 플러그인ext_olly2: OllyDbg v2 플러그인ext_x64dbg: x64dbg 플러그인디스어셈블러 플러그인:
ext_ida/SyncPlugin.pyext_ghidra/dist/ghidra_*_retsync.zip: Ghidra 플러그인ext_bn/retsync: Binary Ninja 플러그인그리고 라이브러리 플러그인:
ext_lib/sync.py: 독립형 Python 라이브러리IDA 및 GDB 플러그인은 유효한 Python 설정이 필요합니다. Python 2 (>=2.7) 및 Python 3을 지원합니다.
WinDbg/OllyDbg/OllyDbg2/x64dbg 디버거용 사전 빌드된 바이너리는 Azure DevOps 파이프라인을 통해 제공됩니다:
마지막 빌드를 선택하고 Related 섹션 아래의 아티팩트를 확인하세요: 6 published.

Ghidra 플러그인의 사전 빌드 플러그인 아카이브는 ext_ghidra/dist에 제공됩니다.
ret-sync는 일반적인 설정(디버거와 디스어셈블러가 동일한 호스트에 있고 모듈 이름이 일치하는 경우)에서 대부분의 사용자에게 기본적으로 작동해야 합니다.
그러나 일부 시나리오에서는 특정 구성이 필요할 수 있습니다. 이를 위해 확장 및 플러그인은 사용자의 홈 디렉터리에 있는 선택적 전역 구성 파일인 .sync를 확인합니다. 이 파일은 유효한 .INI 파일이어야 합니다.
또한 IDA 및 Ghidra 플러그인은 먼저 IDB 또는 프로젝트 디렉터리(<project>.rep)에서 구성 파일을 찾아 로컬(per-IDB/project) 설정을 허용합니다. 로컬 구성 파일이 있으면 전역 구성 파일은 무시됩니다.
이러한 구성 파일에 선언된 값은 기본값을 재정의합니다. 기본적으로 .sync 파일은 생성되지 않습니다.
아래에서는 구성 파일이 유용하거나 필요한 세 가지 일반적인 시나리오를 자세히 설명합니다:
[INTERFACE] 섹션은 네트워크 관련 설정을 사용자 정의하는 데 사용됩니다. 가상 머신(또는 단순히 다른 호스트) 내에서 실행 중인 디버거와 IDA를 동기화하려는 일반적인 원격 커널 디버깅 시나리오를 가정해 보겠습니다.
간단히 두 개의 .sync 파일을 만듭니다:
이는 **ret-sync** ``IDA`` 플러그인이 인터페이스 ``192.168.128.1``에서 포트 ``9234``로 수신하도록 지시합니다. 말할 필요도 없이 이 인터페이스는 원격 호스트나 가상 머신에서 접근 가능해야 합니다.
* 디버거가 실행되는 머신의 사용자 홈 디렉토리에 있는 하나:```
[INTERFACE]
host=192.168.128.1
port=9234
이것은 ret-sync 디버거 플러그인이 이 인터페이스에서 수신 대기하도록 이전에 구성된 ret-sync IDA 플러그인에 연결하도록 지시합니다.
참고: 여기서는 실제 IP를 지정해야 하며 0.0.0.0을 사용하지 마십시오. 이 변수는 바인딩과 연결 모두에 여러 소스에서 사용되므로 0.0.0.0을 사용하면 이상한 오류가 발생할 수 있습니다.
[ALIASES] ntoskrnl_vuln.exe=ntkrnlmp.exe
``[ALIASES]`` 섹션은 디스어셈블러(IDA/Ghidra)가 자체 디스패처/프로그램 매니저에 모듈을 등록할 때 사용하는 이름을 사용자 지정하는 데 사용됩니다.
기본적으로 디스어셈블러 플러그인은 입력 파일의 이름을 사용합니다. 하지만 사용자가 미리 파일 이름을 변경하여 실제 프로세스나 디버거에서 볼 수 있는 로드된 모듈의 이름과 더 이상 일치하지 않을 수 있습니다.
여기서는 단순히 디스패처에게 `ntkrnlmp.exe`(실제 이름)를 `ntoskrnl_vuln.exe`(IDB 이름) 대신 일치시키도록 알려줍니다.
## gdb with Qt Creator debugging frontend
Qt Creator 디버깅 프론트엔드는 gdb 명령어 출력이 기록되는 방식을 변경합니다. 이는 동기화를 방해하므로 임시 파일 대신 동기화에 원시 gdb 출력을 사용하는 옵션이 있습니다. `.sync` 설정 파일에서 사용```
[GENERAL]
use_tmp_logging_file=false
타겟에 Qt 디버깅 프론트엔드를 사용하려면.
/proc/<pid>/maps직렬 연결을 통한 임베디드 장치 디버깅 또는 QEMU에서의 raw 펌웨어 디버깅과 같은 일부 시나리오에서는 gdb가 PID를 인식하지 못하여 /proc/<pid>/maps에 접근할 수 없습니다.
이러한 경우 [INIT] 섹션을 사용하여 플러그인에 사용자 정의 컨텍스트를 전달합니다. 이를 통해 PID 및 메모리 매핑과 같은 일부 필드를 재정의할 수 있습니다.
.sync 콘텐츠 추출:```
[INIT]
context = {
"pid": 200,
"mappings": [ [0x400000, 0x7A81158, 0x7681158, "asav941-200.qcow2|lina"] ]
}
각 매핑 항목은 다음과 같습니다: ``mem_base``, ``mem_end``, ``mem_size``, ``mem_name``.
## 자동 주소 재배치 우회
임베디드 장치 디버깅이나 미니멀한 디버그 인터페이스에 연결하는 등의 시나리오에서는 디스어셈블러 플러그인에 구현된 자동 주소 재배치 기능을 우회하는 것이 더 편리할 수 있습니다.
`use_raw_addr` 옵션은 현재 Ghidra에서만 지원됩니다. .sync 설정 파일에서 다음과 같이 사용합니다:```
[GENERAL]
use_raw_addr=true
IDA 9.2+가 필요합니다. 이전 버전의 경우 사용 가능한 Tags에서 ida9.2 태그 이전의 프로젝트를 체크아웃하세요.
IDA 설치의 경우, ext_ida에서 Syncplugin.py 및 retsync 폴더를 IDA 플러그인 디렉터리로 복사하세요. 예:
C:\Program Files\IDA Pro 7.4\plugins%APPDATA%\Hex-Rays\IDA Pro\plugins~/.idapro/pluginsAlt-Shift-S) 또는 Edit -> Plugins -> ``ret-sync`````
[sync] default idb name: ld.exe
[sync] sync enabled
[sync] cmdline: "C:\Program Files\Python38\python.exe" -u "C:\Users\user\AppData\Roaming\Hex-Rays\IDA Pro\plugins\retsync\broker.py" --idb "target.exe"
[sync] module base 0x100400000
[sync] hexrays #7.3.0.190614 found
[sync] broker started
[sync] plugin loaded
[sync] << broker << dispatcher not found, trying to run it
[sync] << broker << dispatcher now runs with pid: 6544
[sync] << broker << connected to dispatcher
[sync] << broker << listening on port 63107### IDA 플러그인 문제 해결
IDA 확장 프로그램의 문제를 해결하려면 `retsync/rsconfig.py` 파일에서 두 가지 옵션을 사용할 수 있습니다:```
LOG_LEVEL = logging.INFO
LOG_TO_FILE_ENABLE = False
LOG_LEVEL 값을 logging.DEBUG로 설정하면 플러그인이 더 자세한 로그를 출력합니다.
LOG_TO_FILE_ENABLE 값을 True로 설정하면 broker.py 및 dispatcher.py의 예외 정보를 전용 파일에 기록합니다. 로그 파일은 %TMP% 폴더에 retsync.%s.err 이름 패턴으로 생성됩니다.
ext_ghidra/dist 폴더에서 미리 빌드된 버전을 사용하거나, 빌드 지침을 따라 직접 빌드하세요. 각 확장 빌드는 플러그인 파일 이름에 지정된 Ghidra 버전만 지원합니다. 예를 들어 ghidra_9.1_PUBLIC_20191104_retsync.zip은 Ghidra 9.1 Public용입니다.
3. Ghidra 설치에 맞게 확장 프로그램 빌드 (`$GHIDRA_DIR`을 설치 디렉터리로 바꾸세요)```bash
cd ext_ghidra
gradle -PGHIDRA_INSTALL_DIR=$GHIDRA_DIR