Tigress เป็นเครื่องเสมือนจริง/obfuscator สำหรับภาษา C ที่สนับสนุนการป้องกันใหม่ ๆ มากมายจากทั้งวิศวกรรมย้อนกลับและแบบไดนามิกและการโจมตีแบบ de-virtualization โดยเฉพาะอย่างยิ่งเสือตัวเมียป้องกันการลดทอนแบบคงที่โดยการสร้างชุดคำสั่งเสมือนจริงของความซับซ้อนและความหลากหลายโดยพลการโดยการผลิตล่ามที่มีการจัดส่งคำสั่งหลายประเภทและโดยการแทรกรหัสสำหรับการวิเคราะห์ต่อต้านนามแฝง Tigress ป้องกันการยกเลิกการใช้งานแบบไดนามิกโดยการรวมรหัสจริงเข้ากับฟังก์ชั่นปลอมโดยการแทรกการไหลโดยนัยและโดยการสร้างล่ามที่จะทำการตรวจสอบใหม่อย่างช้าๆ Tigress ใช้การบรรจุรหัสเวอร์ชันของตัวเองผ่านการใช้การสร้างรหัสรันไทม์ ในที่สุดการแปลงแบบไดนามิกของ Tigress ให้รูปแบบทั่วไปของการปรับเปลี่ยนรหัสรันไทม์อย่างต่อเนื่อง
ทีม Tigress ได้ให้ความท้าทายบางอย่างที่เราสามารถค้นหาการปกป้องที่แตกต่างกัน
ความท้าทายทั้งหมดใช้เป็นจำนวนการป้อนข้อมูลและส่งคืนแฮช ตัวอย่าง:
$ ./obfuscated_binaries/tigress-2- Challenge-2 1234 202180712448 $ ./obfuscated_binaries/tigress-2- Challenge-2 823748 50564355584 $ ./obfuscated_binaries/tigress-2- Challenge-2 2834723 50714072576
ฟังก์ชั่นการคำนวณแฮชจะทำให้งงงวย ประเภทของการโจมตีที่เป็นไปได้:
เป้าหมายของเราคือ:
และทั้งหมดนี้มีสคริปต์ทั่วไปเพียงหนึ่งเดียว :) ในการทำเช่นนั้นเราทำตามลำดับต่อไปนี้:
หากคุณต้องการข้อมูลเพิ่มเติมคุณสามารถชำระเงินสคริปต์ Solide-Vm.py ของเรา

อย่างไรก็ตามเราได้ผลักดันผลลัพธ์ทั้งหมดของเราในที่เก็บนี้แล้ว แต่ถ้าคุณต้องการทำซ้ำด้วยตัวเองการวิเคราะห์นี้คุณจะต้องดำเนินการ solve-vm.py เช่นนี้:
$ ./solve-vm.py ./obfuscated_binaries/_binary_
ตัวอย่าง:
$ ./solve-vm.py ./tigress-challenges/tigress-0-challenge-0 [+] โหลด 0x400040 - 0x400238 [+] โหลด 0x400238 - 0x400254 [+] โหลด 0x400000 - 0x400f14 [+] โหลด 0x601e28 - 0x602550 [+] โหลด 0x601e50 - 0x601fe0 [+] โหลด 0x400254 - 0x400298 [+] โหลด 0x400dc4 - 0x400e08 [+] โหลด 0x000000 - 0x000000 [+] โหลด 0x601e28 - 0x602000 [+] hooking printf [+] hooking __libc_start_main [+] hooking strtoul [+] เริ่มต้นการจำลอง [+] __LIBC_START_MAIN HOOKED [+] argv [0] = ./tigress-challenges/tigress-0-Challenge-0 [+] argv [1] = 1234 [+] strtoul hooked [+] เป็นสัญลักษณ์ของการกลับมาของ strtoul [+] printf hooked 3035321144166078008 [+] การแยกการแสดงออกของผู้ใช้จุดสิ้นสุด [-] ไม่รองรับคำสั่ง: 0x400539: HLT [+] คำสั่งดำเนินการ: 39816 [+] คำสั่งที่ไม่ซ้ำกันดำเนินการ: 458 [+] PC LEN: 0 [+] การจำลองเสร็จแล้ว [+] การสร้าง symbolic_expressions/tigress-0-challenge-0.py [+] แปลงการแสดงออกเชิงสัญลักษณ์เป็นโมดูล LLVM ... [+] โมดูล LLVM เขียนใน llvm_expressions/tigress-0-challenge-0ll [+] การคอมไพล์แบบ deobfuscated binary ... [+] deobfuscated binary recompiled: deobfuscated_binaries/tigress-0-challenge-0.deobfuscated
จากนั้นการแสดงออกเชิงสัญลักษณ์สามารถพบได้ที่นี่การเป็นตัวแทน LLVM สามารถพบได้ที่นี่และสามารถทำการคอมไพล์ไบนารีได้ที่นี่
ใช้นักเทียบท่า:
$ git clone [email protected]: jonathansalwan/tigress_protection.git $ cd/path/to/tigress_protection $ docker build -t image_tigress_protection $ docker run -v/path/to/tigress_protection:/root/tigress_protection -ti -name = tigress_protection -uLimit = 'stack = -1: -1' image_tigress_protection
ทดสอบภายในคอนเทนเนอร์ Docker
# cd ~/tigress_protection # ./SOLVE-VM.PY TIGRESS-Challenges/Tigress-0-Challenge-0
ในขณะที่เราง่ายขึ้นและคอมไพล์ใหม่ไบนารีใหม่เราต้องให้พฤติกรรมเดียวกันของไบนารีดั้งเดิม ดังนั้นเพื่อทดสอบรุ่นไบนารีของเราเราใช้สคริปต์นี้
$ ./scripts/testing_equality.py ./tigress-challenges/tigress-0-challenge-0 ./deobfuscated_binaries/tigress-0-Challenge-0.deobfuscated - [+] ความสำเร็จด้วย 272966812638982633 [+] ความสำเร็จด้วย 2304147855662358786 [+] ความสำเร็จกับ 15697842028176298504 [+] ความสำเร็จกับ 15273138908025273913 [+] ความสำเร็จกับ 17329851347176088980 [+] ความสำเร็จด้วย 12160831137213706322 [+] ความสำเร็จด้วย 3489058267725840982 [+] ความสำเร็จด้วย 6474275930952607745 [+] ความสำเร็จด้วย 7363567981237584398 [+] ความสำเร็จด้วย 3685039181436704621 [+] ความสำเร็จ: 100.00
โดยพื้นฐานแล้วสคริปต์นี้จะเรียกใช้การทำให้งงงวยและไบนารี deobfuscated ที่มีอินพุตแบบสุ่มและตรวจสอบว่าพวกเขามีผลลัพธ์ที่เหมือนกันหรือไม่

เกี่ยวกับตารางอัตราส่วนหลังจากแก้ไขความท้าทายของ Tigress เราขอให้ Christian Collberg แหล่งที่มาของความท้าทายเพื่อเปรียบเทียบขนาดแหล่งที่มาดั้งเดิมและเวอร์ชัน devirtualized ของเรา โปรดทราบว่าตามคำร้องขอของคริสเตียนเราไม่สามารถจัดหาแหล่งที่มาของความท้าทายเสือถ้าคุณต้องการแหล่งข้อมูลเหล่านี้โปรดถามเขาโดยตรง :)
นอกจากนี้เรายังรับอัลกอริทึมแฮช 20 ครั้ง (10 ที่รู้จักกันดี 10 จากความท้าทายเสือตัวเมีย) และเราปกป้องอัลกอริทึมเหล่านี้แต่ละอันโดยใช้การป้องกันเสือตัวเมีย 46 รายการ (ดูส่วนถัดไป) ในตอนท้ายเรามีบัลลังก์ทดสอบ 920 ไบนารีที่ได้รับการป้องกัน หนึ่งในไบนารีที่ได้รับการป้องกันเหล่านี้ได้รับการพัฒนาอย่างประสบความสำเร็จโดยใช้สคริปต์ solve-vm.py อัลกอริทึมแฮชเหล่านี้สามารถพบได้ในไดเรกทอรีตัวอย่างและเวอร์ชัน devirtualized ของพวกเขาลงในไดเรกทอรี deobfuscated_binaries ตารางต่อไปนี้เป็นบทสรุปของผลลัพธ์ของเราเกี่ยวกับตัวอย่าง 920 ของเรา

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกเหล่านี้ดูหน้า 1 และ 2