
rop_scanner adalah tool offline berbasis command-line yang dirancang khusus untuk menemukan ROP, JOP, syscall, dan stack-pivot gadgets di dalam file PE Windows seperti DLL, EXE, SYS, dan bahkan file EFI. Tool ini ditulis dalam C++17 dan menggunakan Zydis sebagai decoder instruction-nya, menghasilkan output yang terdiri dari ranked gadgets dalam empat format berbeda: text, JSON, ROPgadget, atau dictionary Python siap pakai untuk pwntools. Keunggulan utamanya adalah kemampuannya untuk melakukan parsing secara langsung terhadap file PE dari disk tanpa pernah memuatnya ke dalam process address space, sehingga aman digunakan untuk menganalisis binary berbahaya tanpa risiko eksekusi.
Proyek ini terinsidirasi dari artikel «Hunting ROP Gadgets in Windows DLLs» oleh 0x12 Dark Development (@Salsa12__), namun merupakan implementasi C++17 yang independen dan diperluas. rop_scanner mengatasi empat tantangan utama dalam gadget hunting modern: pertama, MSVC tidak menghasilkan «convenient epilogues» secara natural — gadget seperti pop rcx ; pop rdx ; pop r8 ; pop r9 ; ret harus ditemukan melalui mid-instruction decoding pada byte boundary yang tidak wajar. Kedua, CFG (Control Flow Guard), XFG, dan CET Shadow Stack memfilter kandidat gadget secara agresif. Ketiga, bad bytes seperti \x00, \x0a, \x0d menghancurkan sebagian besar hasil dari scanner generik. Keempat, pencarian cross-module memungkinkan menemukan gadgets yang ada di semua module yang dimuat secara default.
Tool ini tersedia untuk tiga platform — Windows, Linux, dan macOS — dalam satu binary yang self-contained tanpa dependency runtime selain libc/libstdc++. Di Windows, terdapat dependency opsional pada dbghelp.dll untuk PDB resolution. Yang menarik adalah output yang dihasilkan bersifat bit-for-bit identik di ketiga platform untuk file PE yang sama — artinya researcher di Linux dapat menghasilkan daftar gadget yang identik dengan yang dihasilkan di Windows. rop_scanner juga menyertakan Qt6 GUI opsional dengan Qt5 fallback yang membangun dari source tree yang sama.
Versi terbaru saat ini adalah v0.7 yang dirilis pada 18 Juni 2026, dengan 47 stars dan 3 forks di GitHub. Tool ini telah menjalani pengujian cross-platform yang ketat, membuktikan bahwa ntdll.dll yang sama menghasilkan 2516 exports, 5679 pdata entries, dan 2197 CFG entries di MSVC Windows, AppleClang macOS, dan GCC Linux. Setiap ukuran struktur PE dijamin konsisten melalui static_assert di pe_types.h.
Tutorial Penggunaan rop_scanner
Untuk memulai menggunakan rop_scanner, Anda perlu membangun tool ini dari source. Persyaratan yang dibutuhkan adalah C++17 compiler dan CMake minimal versi 3.16. Zydis akan di-pull secara otomatis melalui FetchContent pada saat CMake configure pertama kali. Di Windows, buka Developer Command Prompt untuk VS 2022 dan jalankan perintah berikut untuk melakukan build:
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release diikuti dengan cmake --build build. Binary yang dihasilkan akan berada di build\bin\rop_scanner.exe. Di Linux, install dependencies terlebih dahulu dengan sudo apt install -y cmake g++ make, lalu jalankan perintah build yang sama tanpa flag -G Ninja. Di macOS, cukup install CMake melalui Homebrew (brew install cmake), lalu jalankan build. Untuk membangun GUI, set environment variable GUI=1 sebelum menjalankan build script platform.
Scan sederhana dari satu file PE cukup dengan menjalankan ./build/bin/rop_scanner /path/to/ntdll.dll. Output awal akan menampilkan module passport yang berisi informasi arch, machine type, image base, jumlah sections, exports, pdata, dan CFG entries, diikuti oleh total gadgets yang ditemukan. Setiap gadget ditampilkan dengan kategori, skor, section, RVA, symbol dari EAT, enclosing function dari .pdata, raw bytes, dan disassembly dari Zydis.
Untuk pencarian spesifik, gunakan flag --filter yang mendukung substring search di asm, section, category, semantic, symbol, dan function. Contoh: --filter "pop rcx ; pop rdx ; pop r8" akan mencari gadget loader untuk Windows x64 calling convention. Gunakan --badbytes 00,0a,0d untuk memfilter gadget yang mengandung bytes berbahaya. Flag --min-score 75 hanya menampilkan gadget dengan skor di atas threshold, dan --limit 10 membatasi jumlah output.
Untuk pencarian cross-module yang menghasilkan gadget paling ubiquitous, gunakan mode batch: ./rop_scanner --dir C:\Windows\System32 --filter "syscall" --min-score 80 --no-symbols --limit 50. Mode batch akan melakukan deduplikasi gadgets berdasarkan asm across berbagai module dan mengurutkan berdasarkan module_count. Gadget di posisi teratas adalah yang paling stabil dan survive terhadap Windows update. Output --format pwntools menghasilkan dictionary Python yang bisa langsung di-import ke exploit script.
Analisa Retasan
rop_scanner mewakili evolusi signifikan dalam tooling exploit development untuk Windows. Sementara tool seperti ROPgadget, ropper, dan rp++ sudah lama menjadi standar industri, mereka memiliki keterbatasan fundamental untuk use case Windows spesifik: tidak ada dukungan CFG, tidak ada semantic classification, dan tidak ada mekanisme cross-module ranking. rop_scanner mengisi celah ini dengan pendekatan yang sangat terfokus — menjadi scanner terbaik untuk Windows PE dengan fitur yang tidak dimiliki kompetitornya.
Temuan menarik adalah bagaimana mid-instruction discovery menjadi kunci dalam gadget hunting modern. MSVC compiler menghasilkan function epilogue yang sangat bervariasi tergantung pada optimization level dan konfigurasi build. Gadgets yang dicari oleh exploit developer hampir tidak pernah ada sebagai clean function exit — mereka harus ditemukan sebagai side effect dari memulai decoder pada byte boundary yang tidak wajar di dalam tubuh fungsi yang tidak terkait. Kemampuan Zydis untuk melakukan full x86/x86_64 decoding termasuk VEX/EVEX dan operand memory arbitrer menjadi kunci untuk menemukan gadgets seperti write-mem dan read-mem yang tidak mungkin ditemukan oleh mini-decoder manual.
Dari perspektif defensif, rop_scanner juga menjadi alat yang berharga. Security engineer dapat melakukan baseline batch scan terhadap clean Windows image, menyimpan hasilnya, dan menjalankan ulang secara berkala. Setiap drift yang tidak sesuai dengan Windows Update yang terpublikasi menjadi sinyal — baik module update pihak ketiga dengan bytes baru, atau aktivitas yang mencurigakan. Kemampuan CFG-aware analysis memungkinkan audit terhadap indirect-call surface di dalam binary organisasi sendiri, mengidentifikasi JOP landing pads yang mungkin tidak diharapkan. Tool ini membuktikan bahwa eksploitasi dan pertahanan dapat berjalan berdampingan dengan tool yang sama, yang berbeda hanyalah perspektif dan tujuan penggunaannya.
rop_scanner mengubah Windows ROP dari aktivitas manual yang memakan waktu menjadi build step yang terukur — scan, filter, export, paste ke pwntools, eksekusi. Ini adalah pergeseran paradigma dalam exploit development workflow.
Sumber: GitHub – oxfemale/rop_scanner | core-jmp.org — ROP Gadget Hunting on Windows
