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
จะฉีดเข้าไปในแอปเป้าหมาย
ตรรกะส่วนใหญ่ของ fuzzer อยู่ในตัวแทน
สายรัดมีรูปแบบดังต่อไปนี้:
var fuzz = need("./fuzz");var TARGET_MODULE = "test_linux64";var TARGET_FUNCTION = DebugSymbol.fromName("target_func").address;;var RET_TYPE = "void";var ARGS_TYPES = ['ตัวชี้', ' 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 = function (/* Uint8Array */ payload) { Memory.writeByteArray(payload_mem , เพย์โหลด, เพย์โหลด. ความยาว); func_handle (เพย์โหลด_mem, เพย์โหลด. ความยาว);}
fuzz.fuzzer_test_one_input
เป็นสิ่งจำเป็น หากคุณไม่ระบุ fuzz.target_module
โค้ดทั้งหมดที่เรียกใช้จะถูกควบคุม
คุณยังสามารถตั้งค่า fuzz.manual_loop_start = true
เพื่อบอก fuzzer ว่าคุณจะเรียก fuzz.fuzzing_loop()
ในการโทรกลับ ดังนั้นมันจะต้องไม่เรียกมันให้คุณ (เช่น เริ่ม fuzzer เมื่อมีการคลิกปุ่มในแอพ Android)
callback fuzz.init_callback
สามารถตั้งค่าให้รันโค้ดได้เมื่อ fuzzer พร้อมที่จะเริ่มต้น ดูตัวอย่าง tests/test_java.js
fuzz.dictionary
เป็นพจนานุกรม fuzzer แบบคลาสสิก ซึ่งเป็นอาร์เรย์ที่คุณสามารถเพิ่มรายการได้ (ประเภทที่ยอมรับ ได้แก่ Array, ArrayBuffer, Uint8Array, String) ที่ใช้เป็นค่าเพิ่มเติมใน mutator ดูตัวอย่าง tests/test_libxml2.js
frida-fuzzer
ยอมรับข้อโต้แย้งต่อไปนี้:
-i โฟลเดอร์ | โฟลเดอร์ที่มีเมล็ดเริ่มต้น |
-o โฟลเดอร์ | โฟลเดอร์เอาต์พุตที่มีเมล็ดกลางและขัดข้อง |
-คุณ | เชื่อมต่อกับยูเอสบี |
-วางไข่ | วางไข่และแนบแทนการแนบเพียงอย่างเดียว |
-สคริปต์สคริปต์ | ชื่อไฟล์สคริปต์ (ค่าเริ่มต้นคือ fuzzer-agent.js) |
หากคุณไม่ระบุโฟลเดอร์เอาต์พุต โฟลเดอร์ชั่วคราวจะถูกสร้างขึ้นภายใต้ /tmp หากคุณไม่ระบุโฟลเดอร์ด้วยข้อมูลเริ่มต้น ระบบจะใช้ข้อมูลเริ่มต้น 0000
ที่ไม่ได้รับข้อมูลเป็นข้อมูลเริ่มต้น
หากคุณกำลังคลุมเครือแอปพลิเคชันในเครื่อง คุณอาจต้องการดำเนินการ system-config
ก่อน frida-fuzzer
เพื่อปรับแต่งพารามิเตอร์ของระบบของคุณและเร่งความเร็วสิ่งต่าง ๆ
เมื่อรัน ./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)
มาคลุมเครือไลบรารีที่แชร์แบบเนทีฟในแอป Android ตัวอย่างใน tests
ตรวจสอบให้แน่ใจว่าคุณมีรูทบนอุปกรณ์เสมือนของคุณ:
host$ adb root
ดาวน์โหลด Android x86_64 frida-server จากหน้าเผยแพร่ repo และคัดลอกลงในอุปกรณ์ภายใต้ /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
เปิดแอปในโปรแกรมจำลอง
คลุมเครือฟังก์ชัน test_func
ของไลบรารี libnative-lib.so
ที่มาพร้อมกับแอปทดสอบด้วยคำสั่ง:
host$ ./frida-fuzzer -U -o output_folder/ com.example.ndktest1
กรณีทดสอบและข้อขัดข้องที่น่าสนใจจะถูกบันทึกไว้ใน output_folder
สนุก.
สวัสดี ชุมชน OSS มีสิ่งที่ต้องทำมากมายหากใครต้องการมีส่วนร่วม
การฟัซโค้ด Java (รอวิธีการเปิดเผยเพิ่มเติมใน frida-java-bridge น่าจะง่ายเกือบเสร็จแล้ว)
splice stage (รวมสอง testcase ในคิวและสร้างความเสียหายให้กับมัน)
รองรับพจนานุกรม (และแก้ไขความหายนะด้วย)
การเลือกเมล็ดพันธุ์
เครื่องมือวัดแบบอินไลน์สำหรับ arm64
การให้คะแนนประสิทธิภาพ (สำรวจตารางของแอฟ)
ตัวเปลี่ยนโครงสร้าง (ไบต์กลายพันธุ์ตามไวยากรณ์ที่เขียนด้วย JSON)
CompareCoverage (การทำโปรไฟล์คำสั่งย่อยเพื่อหลีกเลี่ยงสิ่งกีดขวางบนถนนที่คลุมเครือ)
เขียน frida-fuzzer ใหม่ใน C ด้วย frida-core เพื่อให้สามารถเรียกใช้ทุกสิ่งบนอุปกรณ์มือถือ
หากคุณมีข้อสงสัยเกี่ยวกับคุณสมบัติข้อใดข้อหนึ่งนี้ โปรดอย่าลังเลที่จะ DM ฉันทาง Twitter
สำหรับข้อเสนอคุณสมบัติ มีส่วนปัญหา