2017-05-23 12 views
5

मैं हैक करने का प्रयास कर रहा हूँ पर स्मृति का उपयोग नहीं कर सकते हैं/nullfs कर्नेल मॉड्यूल (FreeBSD पर) को समझने के लिए इतना है कि अंत करने के लिए, मैं निम्न करें:FreeBSD मॉड्यूल डिबगिंग - पता

लक्ष्य मशीन पर: kldstat देता है :

Id Refs Address   Size  Name 
1 10 0xffffffff80200000 17e10c8 kernel 
2 1 0xffffffff819e2000 4cf0  vmxnet.ko 
3 1 0xffffffff819e7000 16e0  echo.ko 
4 1 0xffffffff81c11000 23dc  vmmemctl.ko 
5 1 0xffffffff81c14000 641b  nullfs.ko 

nm /boot/kernel/nullfs.ko | grep mount 
00000000000018f0 t null_getwritemount 
0000000000000540 t nullfs_mount 
0000000000000930 t nullfs_unmount 
       U vfs_mountedfrom 
       U vop_getwritemount_desc 

स्थानीय मशीन है जो एक नामित पाइप एक सीरियल कंसोल के रूप में अभिनय (मैं आभासी मशीनों का उपयोग कर रहा) के माध्यम से लक्ष्य को जोड़ता है पर:

(kgdb) tr0 
kdb_sysctl_enter (oidp=<value optimized out>, arg1=<value optimized out>, 
arg2=0xfffffe004e7cc7f0, 
    req=<value optimized out>) at /usr/src/sys/kern/subr_kdb.c:446 
446      kdb_why = KDB_WHY_UNSET; 
Current language: auto; currently minimal 
(kgdb) getsyms 
During symbol reading, Incomplete CFI data; unspecified registers at 
0xffffffff8099497a. 
Id Refs Address Size  Name 
1 10 0x80200000 17e10c8 kernel 
2 1 0x819e2000 4cf0  vmxnet.ko 
3 1 0x819e7000 16e0  echo.ko 
4 1 0x81c11000 23dc  vmmemctl.ko 
5 1 0x81c14000 641b  nullfs.ko 
Select the list above with the mouse, paste into the screen 
and then press ^D. Yes, this is annoying. 
5 1 0x81c14000 641b  nullfs.ko 
add symbol table from file 
"/usr/obj/usr/src/sys/AIJAZ-DEBUG/modules/usr/src/sys/modules/nullfs/nullfs.ko.debug" 
at 
     .text_addr = 0x81c14000 
     .data_addr = 0x81c14000 
     .bss_addr = 0x81c14000 
(kgdb) add-kld nullfs.ko 
add symbol table from file "/boot/kernel/nullfs.ko.symbols" at 
     .text_addr = 0xffffffff81c14000 
     set_sysinit_set_addr = 0xffffffff81c15c90 
     set_sysuninit_set_addr = 0xffffffff81c15cb0 
     .rodata.str1.1_addr = 0xffffffff81c15cc8 
     set_modmetadata_set_addr = 0xffffffff81c15e48 
     set_sysctl_set_addr = 0xffffffff81c15e58 
     .data_addr = 0xffffffff81c15e60 
     .bss_addr = 0xffffffff81c16360 
(y or n) y 
Reading symbols from /boot/kernel/nullfs.ko.symbols... 
location expression too complex...done. 

(kgdb) b nullfs_mount 
Cannot access memory at address 0x81c14540 

जैसा कि कोई ऊपर 'एनएम' और 'kldstat' के आउटपुट से देख सकता है, पते वास्तव में उचित हैं।

मैं भी ऊपर दिए गए पते पर एक "हार्डवेयर ब्रेकप्वाइंट" सेटिंग की कोशिश की:

(kgdb) hbreak *0x81c14540 
Hardware assisted breakpoint 1 at 0x81c14540: file 
/usr/src/sys/modules/nullfs/../../fs/nullfs/null_vfsops.c, line 74. 

(kgdb) c 
Continuing. 
Warning: 
Cannot insert breakpoint 1. 
Error accessing memory address 0x81c14540: Input/output error. 

इस बार हालांकि, हालांकि ब्रेकप्वाइंट पंजीकृत किया गया है, यह कभी नहीं डाला जाता है। लिनक्स पर इस त्रुटि की खोज करने पर, ऐसा लगता है कि कर्नेल कॉन्फ़िगरेशन के हिस्से के रूप में CONFIG_DEBUG_RODATA को बंद करके का ख्याल रखा गया है (प्रति link इस तरह के एक सुरक्षा तंत्र के रूप में प्रतीत होता है जो पता लगाता है कि टेक्स्ट अनुभाग कुछ कारणों से कर्नेल ओवरराइट किया जा रहा है)। यह सॉफ्टवेयर ब्रेकपॉइंट्स की सेटिंग में मदद करता है जो अन्यथा सेट नहीं किया जाएगा। मुझे नहीं पता कि यह कारण भी है।

दूसरा, मैं जानना चाहता हूं कि लक्ष्य पर वास्तविक पते 0xffffffff00000000 से ऊपर हैं, डीबगर केवल निम्न 8 बिट्स की रिपोर्ट करता है। ऐसा इसलिए है क्योंकि इसे समझा/माना जाता है?

इच्छुक तुम से सुनने के लोगों

उत्तर

0

नहीं सीधे जवाब देने क्यों ऐसा होता है (मैं शोध नहीं किया है), मैं जो FreeBSD कर्नेल में एक का उपयोग कर के अपने स्वयं के GDB सर्वर को लागू करता है बजाय QEMU में चलाने के लिए सलाह देंगे । यदि आप एचडब्ल्यू वर्चुअलाइजेशन के बिना क्यूईएमयू चलाते हैं, तो आप कहीं भी विश्वसनीय रूप से एसडब्ल्यू ब्रेकपॉइंट्स सेट कर सकते हैं।

संबंधित मुद्दे