v1.4 저작권 (C) 2020 Andrea Fioraldi [email protected]
Apache License v2.0에 따라 출시됨
이 실험적인 fuzzer는 API 인메모리 퍼징에 사용됩니다.
디자인은 매우 영감을 받았으며 AFL/AFL++를 기반으로 합니다.
ATM 돌연변이원은 매우 간단합니다. 단지 AFL의 혼란과 결합 단계뿐입니다.
테스트/ 아래의 예제만 테스트했습니다. 이것은 WIP 프로젝트이지만 적어도 GNU/Linux x86_64 및 Android x86_64에서 작동하는 것으로 알려져 있습니다.
이를 실행하려면 Frida >= 12.8.1이 필요하고( pip3 install -U frida
) 하네스를 컴파일하려면 frida-tools가 필요합니다.
fuzz
라이브러리를 사용자 정의 하네스로 가져온 다음 frida-compile
로 컴파일하여 frida-fuzzer
대상 앱에 삽입할 에이전트를 생성해야 합니다.
퍼저 논리의 대부분은 에이전트에 있습니다.
하네스의 형식은 다음과 같습니다.
var fuzz = require("./fuzz");var TARGET_MODULE = "test_linux64";var TARGET_FUNCTION = DebugSymbol.fromName("target_func").address;;var RET_TYPE = "void";var ARGS_TYPES = ['pointer', ' int'];var func_handle = 새로운 NativeFunction(TARGET_FUNCTION, RET_TYPE, ARGS_TYPES, { 트랩: '모두' });fuzz.target_module = TARGET_MODULE;var payload_mem = Memory.alloc(fuzz.config.MAX_FILE);fuzz.fuzzer_test_one_input = 함수(/* Uint8Array */ 페이로드) { Memory.writeByteArray(payload_mem , 페이로드, 페이로드.길이); func_handle(payload_mem, payload.length);}
fuzz.fuzzer_test_one_input
은 필수입니다. fuzz.target_module
지정하지 않으면 실행되는 모든 코드가 계측됩니다.
또한 fuzz.manual_loop_start = true
설정하여 fuzzer에게 콜백에서 fuzz.fuzzing_loop()
호출할 것이므로 fuzzer가 대신 호출하지 않도록 할 수 있습니다(예: Android 앱에서 버튼을 클릭하면 퍼징을 시작하도록).
fuzz.init_callback
콜백은 fuzzer가 시작될 준비가 되었을 때 코드를 실행하도록 설정할 수 있습니다. 예제는 tests/test_java.js
참조하세요.
fuzz.dictionary
는 mutator에서 추가 값으로 사용되는 항목(허용되는 유형은 Array, ArrayBuffer, Uint8Array, String)을 추가할 수 있는 배열인 고전적인 fuzzer 사전입니다. 예제는 tests/test_libxml2.js
참조하세요.
frida-fuzzer
다음 인수를 허용합니다:
-i 폴더 | 초기 시드가 있는 폴더 |
-o 폴더 | 중간 시드 및 충돌이 있는 출력 폴더 |
-유 | USB에 연결 |
-알 | 단순히 연결하는 대신 생성 및 연결 |
-스크립트 스크립트 | 스크립트 파일 이름(기본값은 fuzzer-agent.js) |
출력 폴더를 지정하지 않으면 /tmp 아래에 임시 폴더가 생성됩니다. 초기 시드가 있는 폴더를 지정하지 않으면 정보가 없는 시드 0000
이 시작 시드로 사용됩니다.
로컬 애플리케이션을 퍼징하는 경우 frida-fuzzer
보다 먼저 system-config
실행하여 시스템 매개변수를 조정하고 작업 속도를 높일 수 있습니다.
./frida-fuzzer -spawn ./tests/test_linux64
실행하면 터미널에 다음과 같은 상태 화면이 표시됩니다.
또한 fuzz/fuzzer.js
에 사용자 정의 스테이지를 쉽게 추가하고 이를 fuzz/index.js
의 스테이지 목록에 추가할 수도 있습니다.
fuzzer를 사용자 정의하려면 fuzz/config.js
편집하세요. 변경할 수 있는 변수는 MAP_SIZE(퍼징하는 코드가 작은 경우 코드를 줄이고 약간의 속도를 얻을 수 있음), MAX_FILE(생성된 입력의 최대 크기) 및 QUEUE_CACHE_MAX_SIZE(퍼징하려는 코드의 큐 캐시 크기 증가)입니다. 특히 Android에서는 더 빠른 속도를 제공합니다).
tests
에서 예제 Android 앱의 기본 공유 라이브러리를 퍼지해 보겠습니다.
가상 장치에 루트가 있는지 확인하십시오.
host$ adb root
repo 릴리스 페이지에서 Android x86_64 frida-server를 다운로드하고 장치의 /data/local/tmp 아래에 복사합니다(adb push 사용).
쉘을 시작하고 frida-server를 실행하십시오:
device# cd /data/local/tmp device# ./frida-server
이제 에뮬레이터 창에 드래그 앤 드롭을 사용하여 테스트 앱 tests/app-debug.apk
설치합니다.
그런 다음 앱을 엽니다.
frida-compile을 사용하여 에이전트 스크립트를 컴파일합니다.
host$ frida-compile -x tests/test_ndk_x64.js -o fuzzer-agent.js
에뮬레이터에서 앱을 엽니다.
다음 명령을 사용하여 테스트 앱과 함께 제공되는 libnative-lib.so
라이브러리의 test_func
함수를 퍼지합니다.
host$ ./frida-fuzzer -U -o output_folder/ com.example.ndktest1
흥미로운 테스트 케이스와 충돌은 모두 output_folder에 저장됩니다.
즐기다.
OSS 커뮤니티 여러분, 누군가가 기여하고 싶다면 해야 할 일이 많이 있습니다.
Java 코드 퍼징(frida-java-bridge에서 추가로 노출된 메소드를 기다리는 것은 쉽고 거의 완료되어야 함)
스플라이스 단계(큐에 있는 두 개의 테스트 케이스를 병합하고 이에 혼란을 가함)
사전 지원 (따라서 혼란도 수정)
종자 선택
arm64용 인라인 계측
성과 채점(AFL 일정 살펴보기)
구조적 변경자(JSON으로 작성된 문법을 기반으로 바이트 변경)
CompareCoverage(퍼징 로드블록을 우회하기 위한 하위 명령어 프로파일링)
모바일 장치에서 모든 작업을 실행할 수 있도록 frida-core를 사용하여 C로 frida-fuzzer를 다시 작성하세요.
이 기능 중 하나에 대해 의문이 있으시면 언제든지 Twitter에서 DM을 보내주세요.
기능 제안의 경우 문제 섹션이 있습니다.