
ROP 가젯 탐지를 위한 ML 기반 그래프 기반 다중 아키텍처 접근법
LCSAJdump는 ROP(Return-Oriented Programming) 및 JOP(Jump-Oriented Programming) 가젯을 발견하기 위해 설계된 정적 분석 프레임워크입니다. 기존 스캐너와 달리 LCSAJdump는 아키텍처에 구애받지 않으며 그래프 기반 접근 방식을 사용하여 일반적인 선형 도구로는 보이지 않는 취약점을 찾아냅니다.
일반적인 ROP 스캐너는 바이너리의 실행 가능한 바이트에 대해 선형 "슬라이딩 윈도우" 방식을 사용합니다. 이 방법은 무조건 점프나 조건부 분기로 연결된 비연속 메모리 블록을 횡단하는 실행 체인인 섀도 가젯(Shadow Gadgets) 을 체계적으로 식별하지 못합니다.
LCSAJdump는 LCSAJ(Linear Code Sequence and Jump) 분석을 통해 제어 흐름 그래프(CFG) 를 재구성하여 이 한계를 극복합니다. 바이너리를 기본 블록의 방향 그래프로 모델링함으로써 다음을 식별합니다:
.text 섹션을 LCSAJ 기본 블록으로 분할하고, 커스텀 역방향 제어 흐름 그래프(경량 인접 표현, 무거운 그래프 의존성 없음)를 통해 흐름 관계를 재구성.--depth 홉 내에서 가젯 테일에서 도달 가능한 노드만 유지하여 대형 바이너리(예: libc)에서 메모리와 빌드 시간을 크게 줄이면서도 동일한 결과를 생성.(벤치마크 참조).
LCSAJdump는 범용적으로 설계되었습니다. 현재 지원:
config.py에서 새 프로필을 정의하여 쉽게 구현 가능.pip install lcsajdump
git clone [https://github.com/Chris1sFlaggin/LCSAJdump.git](https://github.com/Chris1sFlaggin/LCSAJdump.git)
cd LCSAJdump
pip install -r requirements.txt
LCSAJdump는 정밀한 바이너리 분석을 위한 강력한 CLI를 제공합니다:
표준 분석 (기본 RISC-V):
python LCSAJdump.py <path_to_binary>
고급 분석 (아키텍처 및 출력 파일 지정):
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <path_to_binary>
나쁜 문자 필터와 함께 JSON으로 내보내기:
lcsajdump -a x86_64 -d 20 -k 5 -b "000a0d" --json -o gadgets.json <path_to_binary>
참고: JSON을 파일로 저장하려면
--json뒤에-o를 사용하세요.--json이 없으면-o는 일반 텍스트를 저장합니다.
일반 텍스트 출력 저장:
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <path_to_binary>
모든 실행 가능 섹션 분석:
lcsajdump --all-exec -d 25 -k 10 -l 30 <path_to_binary>
엄격히 알고리즘 랭킹 사용 (ML 우회):
lcsajdump --algo <path_to_binary>
LCSAJdump는 benchmarkTests/ 디렉토리에 위치한 엄격하고 점진적으로 검증된 테스트 스위트로 뒷받침됩니다.
14번의 주요 의미론적 특성 엔지니어링 반복을 통해 하이브리드 모델은 순수 구문론적 휴리스틱이 아닌 실제 메모리 부작용(angr 기호 실행을 통해 추출)을 기반으로 가젯을 판별하는 방법을 학습했습니다.
그룹 인식 5겹 교차 검증(훈련 중 본 적 없는 테스트 바이너리)으로 평가된 랭커는 NDCG@1 = 0.914 ± 0.047 및 NDCG@10 = 0.922 ± 0.052를 달성하여, 가장 유용한 가젯이 출력 상단에 일관되게 배치됨을 의미합니다. 2단계 엔진은 깨끗한 스택 팝 시퀀스와 ret2csu 유형 호출을 성공적으로 우선시하면서, 기존 정적 스캐너를 속이는 충돌-prone 고정 오프셋 점프에는 높은 페널티를 부과합니다.
리포지토리는 최종 사용자와 ML 연구자 모두를 지원하도록 구성되어 있습니다.
lcsajdump/ml_study/ 디렉토리에는 모델 훈련에 사용된 전체 파이프라인이 포함되어 있습니다:
build_dataset.py: CTF 바이너리 모음에서 구조적 및 의미론적 특성을 추출합니다.train_model.py: LightGBM LambdaRank 모델을 훈련하고 .pkl 모델을 출력합니다.kfold_cv.py: K-겹 교차 검증을 사용하여 데이터셋을 검증합니다.프레임워크는 새로운 구현에 열려 있습니다. 새 아키텍처를 추가하려면:
lcsajdump/core/config.py를 엽니다.ARCH_PROFILES 사전에 새 프로필을 추가하여, 원하는 아키텍처(예: x86_64)에 대한 점프 니모닉, 리턴 니모닉 및 레지스터를 정의합니다.이 프로젝트는 MIT 라이선스로 배포됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
프로젝트 웹 페이지 방문: LCSAJdump 웹 페이지
| 플래그 | 유형 | 기본값 | 설명 |
|---|
-a, --arch | TEXT | auto | 대상 아키텍처 (auto, riscv64, x86_64, arm64). ELF 헤더에서 자동 감지. |
-d, --depth | INTEGER | 20 | LCSAJ 블록 내 최대 검색 깊이. 체인 길이 제어. |
-k, --darkness | INTEGER | 5 | 가지치기 임계값 — 노드당 최대 방문 횟수. 높을수록 더 많은 가젯, 느린 스캔. |
-l, --limit | INTEGER | 10 | 출력에 표시할 최대 가젯 수. |
-s, --min-score | INTEGER | 0 | 결과에 나타나기 위한 최소 휴리스틱 점수. |
-i, --instructions | INTEGER | 15 | 단일 LCSAJ 노드에 포함된 최대 명령어 수. |
-v, --verbose | FLAG | — | 상세 출력 활성화 (가젯별 세부 결과). |
-o, --output | PATH | — | 출력을 파일로 저장. 기본값은 일반 텍스트; JSON 출력을 위해 --json과 함께 사용. |
-b, --bad-chars | TEXT | — | 가젯 주소에서 필터링할 16진수 바이트 (예: "000a0d"). |
--json | FLAG | — | 가젯을 구조화된 JSON으로 출력. -o와 결합하여 파일에 저장. |
--all-exec | FLAG | — | .text뿐만 아니라 모든 실행 가능 섹션 분석. |
-al, --algo | FLAG | — | 엄격히 알고리즘 랭킹 사용 (ML 우회). |
--version | FLAG | — | 설치된 버전 표시 후 종료. |
--help | FLAG | — | 도움말 메시지 표시 후 종료. |