Retrowrite เป็นผู้เขียนไบนารีแบบคงที่สำหรับ X64 และ AARCH64 มันใช้งานได้โดยไม่มีฮิวริสติกไม่แนะนำค่าใช้จ่ายและใช้เทคนิคการ ทำให้เป็นสัญลักษณ์ (หรือที่เรียกว่า แอสเซมบลีที่ประกอบใหม่ ) เพื่อแทรกเครื่องมือวัดเข้ากับไบนารีโดยไม่จำเป็นต้องใช้ซอร์สโค้ด
โปรดทราบว่าเวอร์ชัน x64 และเวอร์ชัน ARM64 ใช้อัลกอริทึมการเขียนใหม่ที่แตกต่างกันและรองรับชุดคุณสมบัติที่แตกต่างกัน
สำหรับรายละเอียดทางเทคนิคคุณสามารถอ่านกระดาษ (ใน IEEE S & P'20 ) สำหรับเวอร์ชัน x64 และวิทยานิพนธ์นี้สำหรับเวอร์ชัน ARM64
Kretrowrite เป็นตัวแปรของรุ่น x64 ที่รองรับการเขียนใหม่ของโมดูลเคอร์เนล Linux
Retrowrite ถูกนำไปใช้ใน Python3 (3.6) มันขึ้นอยู่กับ pyelftools และ capstone ในการติดตั้งการอ้างอิงโปรดเรียกใช้:
pip install - r requirements . txtไม่แนะนำให้ติดตั้งการพึ่งพาจากผู้จัดการแพ็คเกจ Distro ของคุณเนื่องจากอาจล้าสมัย
| Retrowrite-x64 | Retrowrite-Aarch64 | |
|---|---|---|
| พลิกไบนารี | (WIP) | |
| ไบนารีที่ไม่ใช่วงกลม | ||
| คอมไพเลอร์ที่ไม่ได้มาตรฐาน | ||
| ค่าใช้จ่ายเป็นศูนย์ | ||
| สนับสนุนโมดูลเคอร์เนล | ||
| เครื่องมือวัดแอฟ | ||
| เครื่องมือวัดอาซัน | ||
| การสนับสนุน C ++ | (WIP) | (WIP) |
(retro) $ retrowrite --help
usage: retrowrite [-h] [-a] [-A] [-m MODULE] [-k] [--kcov] [-c] [--ignore-no-pie] [--ignore-stripped] [-v] bin outfile
positional arguments:
bin Input binary to load
outfile Symbolized ASM output
optional arguments:
-h, --help show this help message and exit
-a, --assemble Assemble instrumented assembly file into instrumented binary
-A, --asan Add binary address sanitizer instrumentation
-m MODULE, --module MODULE
Use specified instrumentation pass/module in rwtools directory
-k, --kernel Instrument a kernel module
--kcov Instrument the kernel module with kcov
-c, --cache Save/load register analysis cache (only used with --asan)
--ignore-no-pie Ignore position-independent-executable check (use with caution)
--ignore-stripped Ignore stripped executable check (use with caution)
-v, --verbose Verbose output เลือกบัตรผ่านเครื่องมือที่คุณต้องการใช้กับ retrowrite -m <pass> คุณสามารถค้นหาเครื่องมือวัดที่มีอยู่ในโฟลเดอร์ rwtools_x64 และ rwtools_arm64
เครื่องมือวัดที่มีอยู่สำหรับ X64: - ที่อยู่
เครื่องมือที่มีอยู่ผ่านสำหรับ AARCH64: - addressSanitizer - ข้อมูล AFL -coverage + ForkServer - ความสมบูรณ์ของการควบคุมการควบคุมแบบหยาบในรายการฟังก์ชั่น
retrowrite --asan </path/to/binary/> </path/to/output/binary>
หมายเหตุ: หากใน X64 ตรวจสอบให้แน่ใจว่าไบนารีนั้นไม่ขึ้นกับตำแหน่งและไม่ถูกถอดออก สามารถตรวจสอบได้โดยใช้คำสั่ง file (เอาต์พุตควรบอกว่า ELF shared object )
ตัวอย่างสร้าง /bin/ls เวอร์ชันเครื่องมือ:
retrowrite --asan /bin/ls ls-basan-instrumented.s
สิ่งนี้จะสร้างไฟล์แอสเซมบลี ( .s ) ในการคอมไพล์ใหม่การชุมนุมกลับเข้าไปในไบนารีมันขึ้นอยู่กับสถาปัตยกรรม:
แอสเซมบลีที่สร้างขึ้นสามารถประกอบและเชื่อมโยงโดยใช้คอมไพเลอร์ใด ๆ เช่น:
gcc ls-basan-instrumented.s -lasan -o ls-basan-instrumented
การดีบัก ในกรณีที่คุณได้รับข้อผิดพลาด undefined reference to `__asan_init_v4' แทนที่" ASAN_INIT_V4 "โดย" ASAN_INIT "ในไฟล์แอสเซมบลีคำสั่งต่อไปนี้สามารถช่วยคุณได้: sed -i 's/asan_init_v4/asan_init/g' ls-basan-instrumented.s
ใน AARCH64 เรายังพึ่งพาคอมไพเลอร์มาตรฐานเพื่อประกอบและเชื่อมโยง แต่คอลเลกชันของธงคอมไพเลอร์นั้นมีส่วนเกี่ยวข้องมากขึ้นเล็กน้อยดังนั้นเราจึงจัดหาสวิตช์ -a บน retrowrite หลักที่สามารถทำได้เพื่อคุณ:
retrowrite -a ls-basan-instrumented.s -lasan -o ls-basan-instrumented
ในการสร้างไบนารีที่ได้รับการรับรองจากแอฟให้สร้างแอสเซมบลีที่เป็นสัญลักษณ์ตามที่อธิบายไว้ข้างต้น จากนั้นคอมไพล์ใหม่การประกอบที่เป็นสัญลักษณ์ด้วย afl-gcc จาก AFL ++ เช่นนี้:
$ AFL_AS_FORCE_INSTRUMENT=1 afl-gcc foo.s -o foo
หรือ afl-clang
หากต้องการใช้เครื่องมือไบนารีด้วยข้อมูลความครอบคลุมให้ใช้การครอบคลุมเครื่องมือวัดผ่านด้วย retrowrite -m coverage <input file> <output asm> รวบรวมไบนารีอีกครั้งด้วย retrowrite -a <output asm> <new binary>
ตอนนี้ไบนารีสามารถฟาดด้วย:
afl-fuzz -i < seed folder > -o < out folder > < new binary > Retrowrite ยังพยายามเพิ่มเครื่องมือเพื่อทำหน้าที่เป็นผู้ให้บริการสำหรับ AFL ในกรณีนี้ทำให้เกิดปัญหาคุณสามารถปิดการใช้งานพฤติกรรมนี้ได้โดยใช้ export AFL_NO_FORKSERVER=1
ในการสร้างแอสเซมบลีที่เป็นสัญลักษณ์ที่อาจแก้ไขด้วยมือหรือโพสต์โดยเครื่องมือที่มีอยู่เพียงไม่ระบุเครื่องมือใด ๆ ที่ผ่านมา:
retrowrite </path/to/binary> <path/to/output/asm/files>
ไฟล์ ASM เอาต์พุตสามารถแก้ไขได้อย่างอิสระด้วยมือหรือด้วยเครื่องมืออื่น ๆ โพสต์-การแก้ไขไฟล์ ASM อาจรวมเข้ากับไบนารีที่ทำงานตามที่อธิบายไว้ข้างต้น
ในขณะที่ Retrowrite สามารถทำงานร่วมกันได้กับเครื่องมืออื่น ๆ เราขอแนะนำให้นักวิจัยใช้ Retrowrite API สำหรับความต้องการเครื่องมือ / การดัดแปลงไบนารี! สิ่งนี้จะช่วยประหยัดความพยายามเพิ่มเติมในการโหลดและแยกวิเคราะห์ไบนารีหรือไฟล์ประกอบ
เรียกใช้ setup.sh :
./setup.sh kernelเปิดใช้งาน virtualenv (จากรูทของที่เก็บ):
source retro/bin/activate(โบนัส) เพื่อออกจาก VirtualEnv เมื่อคุณทำ Retrowrite เสร็จแล้ว:
deactivateretrowrite --asan --kernel </path/to/module.ko> </path/to/output/module_asan.ko>retrowrite </path/to/module.ko> <path/to/output/asm/files> สำหรับแคมเปญฟัซซิ่งโปรดดูฟัซซิ่ง/ โฟลเดอร์
โดยทั่วไป librw/ มีรหัสสำหรับการโหลดการถอดและสัญลักษณ์ของไบนารีและสร้างแกนหลักของการแปลงทั้งหมด การแปลงรายบุคคลผ่านที่สร้างขึ้นด้านบนกรอบการเขียนใหม่นี้เช่น sanitizer ที่อยู่ไบนารีเท่านั้นของเรา (BASAN) มีอยู่เป็นเครื่องมือส่วนบุคคลใน rwtools/
ไฟล์และโฟลเดอร์ที่เริ่มต้นด้วย k เชื่อมโยงกับเคอร์เนลเวอร์ชัน Retrowrite
ในการสาธิต/โฟลเดอร์คุณจะพบตัวอย่างสำหรับผู้ใช้สเปซและเคอร์เนล retrowrite (demos/user_demo และ demos/kernel_demo ตามลำดับ)
สิ่งพิมพ์ต่อไปนี้ครอบคลุมส่วนต่าง ๆ ของโครงการ Retrowrite:
Retrowrite: COTS แบบคงที่แบบคงที่สำหรับการฟุ่มเฟือยและการฆ่าเชื้อ Sushant Dinesh, Nathan Burow, Dongyan Xu และ Mathias Payer ใน Oakland'20: IEEE International Symposium เรื่องความปลอดภัยและความเป็นส่วนตัว, 2020
ไม่มีแหล่งที่มาไม่มีปัญหา! ไบนารีความเร็วสูงฟัซซิ่ง Matteo Rizzo และ Mathias Payer ใน 36C3'19: Chaos Communication Congress, 2019
ใบอนุญาต MIT
ลิขสิทธิ์ (C) 2019 กลุ่ม hexhive, sushant dinesh [email protected], luca di bartolomeo [email protected], antony vennard [email protected], matteo rizzo matteorizzo.personal@gmail
ได้รับอนุญาตโดยไม่ต้องเสียค่าใช้จ่ายสำหรับบุคคลใด ๆ ที่ได้รับสำเนาซอฟต์แวร์นี้และไฟล์เอกสารที่เกี่ยวข้อง ("ซอฟต์แวร์") เพื่อจัดการในซอฟต์แวร์โดยไม่มีการ จำกัด รวมถึง แต่ไม่ จำกัด เฉพาะสิทธิ์ในการใช้สำเนาดัดแปลงผสานเผยแพร่เผยแพร่
ประกาศลิขสิทธิ์ข้างต้นและประกาศการอนุญาตนี้จะรวมอยู่ในสำเนาทั้งหมดหรือส่วนสำคัญของซอฟต์แวร์
ซอฟต์แวร์มีให้ "ตามสภาพ" โดยไม่มีการรับประกันใด ๆ ไม่ว่าโดยชัดแจ้งหรือโดยนัยรวมถึง แต่ไม่ จำกัด เฉพาะการรับประกันความสามารถในการค้าการออกกำลังกายสำหรับวัตถุประสงค์เฉพาะและการไม่เข้าร่วม ไม่ว่าในกรณีใดผู้เขียนหรือผู้ถือลิขสิทธิ์จะต้องรับผิดชอบต่อการเรียกร้องความเสียหายหรือความรับผิดอื่น ๆ ไม่ว่าจะเป็นการกระทำของสัญญาการละเมิดหรืออื่น ๆ ที่เกิดขึ้นจากหรือเกี่ยวข้องกับซอฟต์แวร์หรือการใช้งานหรือการติดต่ออื่น ๆ ในซอฟต์แวร์