
KVM का उपयोग करके मेमोरी स्नैपशॉट की हल्की फ़ज़िंग
KVM का उपयोग करके मेमोरी स्नैपशॉट की हल्की-फुल्की फ़ज़िंग
Snapchange कच्चे मेमोरी डंप और रजिस्टर स्थिति को KVM वर्चुअल मशीन (VM) में लोड करने की क्षमता प्रदान करता है। निष्पादन के किसी बिंदु पर, इस VM को KVM द्वारा पाए गए गंदे पृष्ठों (dirty pages) या किसी फ़ज़र द्वारा मैन्युअल रूप से गंदे किए गए पृष्ठों को रीसेट करके अपनी प्रारंभिक स्थिति में रीसेट किया जा सकता है।
LibTIFFFFmpeg$ cp -r -L fuzzer_template your_new_fuzzer
your_new_fuzzer/create_snapshot.sh को संशोधित करेंsrc/fuzzer.rs अपडेट करें#[derive(Default)]
pub struct TemplateFuzzer;
impl Fuzzer for TemplateFuzzer {
// The type of Input being fuzzed. Used to know how to generate and mutate useful inputs.
type Input = Vec<u8>;
// The starting address of the snapshot
const START_ADDRESS: u64 = 0x402363;
// The maximum length of mutated input to generate
const MAX_INPUT_LENGTH: usize = 100;
fn set_input(&mut self, input: &Self::Input, fuzzvm: &mut FuzzVm<Self>) -> Result<()> {
// Write the mutated input into the data buffer in the guest VM
fuzzvm.write_bytes_dirty(VirtAddr(0x402004), CR3, &input)?;
Ok(())
}
fn reset_breakpoints(&self) -> Option<&[BreakpointLookup]> {
Some(&[
// Reset when the VM hits example1!main+0x123
BreakpointLookup::SymbolOffset("example1!main", 0x123)
])
}
}
$ cargo run -r -- fuzz -c 16
इस README के लिए शब्दों का त्वरित उपयोग:
हाइपरवाइज़र प्रत्येक अनुरोधित कोर के लिए भौतिक मेमोरी फ़ाइल को मैप करके शुरू होता है। इस प्रकार, प्रत्येक कोर के पास मेमोरी की अपनी अद्वितीय प्रति होती है। फिर हाइपरवाइज़र KVM गेस्ट बनाता है और गेस्ट को यह बैकिंग मेमोरी देता है। इस गेस्ट की रजिस्टर स्थिति दी गई रजिस्टर स्थिति के साथ प्रारंभ की जाती है और गेस्ट का निष्पादन प्रारंभ किया जाता है। हाइपरवाइज़र तब तक प्रतीक्षा करता है जब तक गेस्ट बाहर नहीं निकलता। प्रत्येक निकास (exit) हाइपरवाइज़र द्वारा संभाला जाता है और कुछ को टारगेट-विशिष्ट म्यूटेशन, संशोधन, या इंट्रोस्पेक्शन के लिए फ़ज़र को पास किया जाता है। यदि निकास का हैंडलर संकेत देता है कि गेस्ट को रीसेट किया जाना चाहिए, तो हाइपरवाइज़र रन लूप से बाहर निकलता है और गेस्ट को मूल स्नैपशॉट स्थिति में रीसेट करता है तथा रन लूप को फिर से शुरू करता है।
गेस्ट की कवरेज कवरेज ब्रेकपॉइंट्स का उपयोग करके उत्पन्न की जाती है। ब्रेकपॉइंट किए जाने वाले पतों की सूची वाली एक अलग फ़ाइल हाइपरवाइज़र को दी जा सकती है। यदि इनमें से कोई भी पता हिट होता है, तो पता कवरेज डेटाबेस में जोड़ दिया जाएगा और उस पते के लिए निर्देश पुनर्स्थापित कर दिया जाएगा। इस प्रकार, ब्रेकपॉइंट दोबारा ट्रिगर नहीं होगा।
Snapchange कॉन्फ़िगरेशन के लिए टारगेट-विशिष्ट प्रोजेक्ट निर्देशिकाओं का लाभ उठाता है। यह निर्देशिका वह जगह है जहाँ इनपुट और आउटपुट फ़ाइलें तथा निर्देशिकाएँ रखी जाती हैं। निम्नलिखित फ़ाइल एक्सटेंशन/निर्देशिकाएँ इनपुट के रूप में उपयोग की जाती हैं:
.physmem - वह फ़ाइल जिसमें कच्ची, भौतिक मेमोरी फ़ाइल होती है.regs - रजिस्टर स्थिति युक्त JSON रजिस्टर फ़ाइल.qemuregs - qemu से info registers का आउटपुटप्रोजेक्ट निर्देशिका में फ़ाइलों और उनके उपयोगों की पूरी सूची यहाँ पाई जा सकती है
डीबगिंग सिंगल-स्टेप ट्रेस का पूरा उदाहरण यहाँ पाया जा सकता है।
ITERATION 604 0x00007ffff7ecb0d5 0x11115000 | libc-2.31.so!__GI___getpid+0x5 (0x7ffff7ecb0d5)
syscall
[0f, 05]
ITERATION 605 0xffffffff83a00000 0x11115000 | entry_SYSCALL_64+0x0 (0xffffffff83a00000)
swapgs
[0f, 01, f8]
ITERATION 606 0xffffffff83a00003 0x11115000 | entry_SYSCALL_64+0x3 (0xffffffff83a00003)
mov qword ptr gs:[0xa014], rsp
[None:0x0+0xa014=0xa014]]
RSP:0x7fffffffeb78 -> example1!main+0x19 (0x55555555514e)-> 0xff8458b48f44589
[65, 48, 89, 24, 25, 14, a0, 00, 00]
ITERATION 607 0xffffffff83a0000c 0x11115000 | entry_SYSCALL_64+0xc (0xffffffff83a0000c)
nop
[66, 90]
ITERATION 608 0xffffffff83a0000e 0x11115000 | entry_SYSCALL_64+0xe (0xffffffff83a0000e)
mov rsp, cr3
RSP:0x7fffffffeb78 -> example1!main+0x19 (0x55555555514e) -> 0xff8458b48f44589
CR3:0x11115000
[0f, 20, dc]
VirtualBox या QEMU के माध्यम से स्नैपशॉट प्राप्त करने की जानकारी नीचे दी गई है:
उदाहरणों में एक make_example.sh (जैसे example 1) स्क्रिप्ट शामिल है जो शुरू से पूर्ण स्नैपशॉट बनाती है। इन उदाहरणों का उपयोग पुनरुत्पादनीय स्नैपशॉट के लिए अन्य टारगेट्स के टेम्पलेट के रूप में किया जा सकता है।
make all
cargo doc --open
HACKING सिस्टम को समझना शुरू करने के लिए कोड बेस में कुछ उच्च-स्तरीय स्थान प्रदान करता है।
अधिक जानकारी के लिए CONTRIBUTING देखें।
यह प्रोजेक्ट Apache-2.0 License के अंतर्गत लाइसेंस प्राप्त है।