Alat Debugging Mode Kernel Windows. Hardcore debugging dengan Linice: belajar bekerja di kernel console debugger Windows 7 kernel debugging mode runtime

Untuk melakukan debugging kernel, Anda harus terhubung ke komputer Anda menggunakan kabel null modem atau koneksi dial-up. Komputer yang melakukan debugging akan disebut "Host", dan nama "Target" akan diberikan ke komputer yang bermasalah.

Kedua komputer harus menjalankan versi Windows yang sama, dan file simbol untuk komputer Target harus diinstal di komputer Host. File simbol tersedia di CD instalasi Windows di direktori Support\Debug.

Untuk mengaktifkan debugging, Anda perlu melakukan perubahan pada file BOOT.INI di komputer Target.

1. Ubah atribut file BOOT.INI:

attrib c:\boot.ini -r -s

2. Edit file ini dan ke baris Memulai Windows tambahkan opsi /debug (untuk memberi tahu sistem agar memuat debugger kernel ke dalam RAM kapan Boot Windows). Opsi tambahan adalah /Debugport memberi tahu sistem yang mana port COM harus digunakan (default COM2) dan /Baudrate - untuk menentukan baud rate (defaultnya adalah 19200 baud, tetapi 9600 lebih baik). Misalnya:


multi(0)disk(0)rdisk(0)partisi(0)\WINDOWS="Windows NT" /debug /debugport=com2 /baudrate=9600

3. Simpan file.

4. Tetapkan atribut file BOOT.INI sebelumnya:

attrib c:\boot.ini +r +s

Dalam contoh ini, komputer Target mengizinkan koneksi melalui port COM2 pada 9600 bps.

Komputer Host harus dikonfigurasi dengan pengaturan yang diperlukan untuk debugging. Selain itu, file simbol harus diinstal. Untuk menginstalnya, arahkan ke direktori \support\debug pada CD instalasi dan masukkan perintah berikut:

expndsym : <целевой диск и каталог>

Misalnya:

expndsym f: d:\simbol

Instalasi mungkin memakan waktu. Ingatlah bahwa jika paket layanan telah diinstal di komputer Target, file simbol dari paket tersebut juga harus diinstal di komputer Host. File simbol untuk paket layanan dapat diunduh dari situs web Microsoft.

Langkah selanjutnya adalah menyiapkan variabel lingkungan yang diperlukan untuk debugging, seperti variabel yang menentukan lokasi file simbol, dan sebagainya. Berikut adalah penjelasan dari variabel-variabel tersebut.

Deskripsi variabel sistem

Definisi variabel-variabel ini dapat ditempatkan di berkas kumpulan untuk menghindari mengetik perintah yang sesuai pada setiap boot:

gema mati
atur _nt_debug_port=com2
atur _nt_debug_baud_rate=9600
atur _nt_symbol_path=d:\symbols\i386
atur _nt_log_file_open=d:\debug\logs\debug.log

Sekarang Anda perlu menyalin perangkat lunak kernel debug, yang terletak di direktori support\debug\<процессор>pada CD instalasi (dukungan\debug\I386). Cara termudah adalah menyalin seluruh direktori, karena ukurannya kecil (sekitar 2,5 MB). Untuk platform I386, debugger digunakan, yang disertakan sebagai file I386KD.EXE. Debugger diluncurkan menggunakan perintah I386KD. Untuk memasukkan perintah, tekan kombinasi tombol dan tunggu prompt muncul garis komando kd>.

Debugger mode kernel berada di antara CPU dan sistem operasi. Ini berarti bahwa ketika Anda menghentikan debugger mode kernel, sistem operasi juga berhenti sepenuhnya. Sangat mudah untuk melihat bahwa transisi sistem operasi untuk berhenti keras berguna saat Anda bekerja dengan masalah pengatur waktu dan pengaturan waktu. Namun, dengan pengecualian satu debugger, yang dibahas di bawah ini (di bagian "SoftlCE Debugger" di bab ini), Anda tidak dapat men-debug kode mode pengguna menggunakan debugger mode kernel.

Tidak banyak debugger mode kernel. Beberapa diantaranya adalah: Windows 80386 Debugger (WDEB386), Kernel Debugger (1386KD), WinDBG dan SoftlCE. Masing-masing debugger ini dijelaskan secara singkat di bagian berikut.

debugger WDEB386

WDEB386 adalah debugger mode kernel Windows 98 yang didistribusikan sebagai bagian dari Platform SDK. Debugger ini hanya berguna untuk pengembang yang menulis driver mesin virtual. perangkat Windows 98(VxD). Seperti kebanyakan debugger mode kernel untuk sistem operasi Windows, debugger WDEB386 membutuhkan dua mesin dan kabel null modem untuk dijalankan. Kedua mesin tersebut diperlukan karena bagian dari debugger yang berjalan pada mesin target sudah ada akses terbatas ke perangkat kerasnya sehingga mengirimkan keluarannya ke dan menerima perintah dari mesin lain.

Debugger WDEB386 memiliki sejarah yang menarik. Ini dimulai sebagai alat latar belakang internal Microsoft selama era Windows 3.0. Sulit untuk digunakan dan tidak memiliki dukungan debugging yang cukup. Kode sumber dan fitur bagus lainnya dimanjakan oleh debugger Visual C++ dan Visual Basic.

Tim "Dotted" (DOT) adalah yang paling banyak fitur penting WDEB386. Melalui interupsi INT 41, Anda dapat memperluas WDEB386 untuk menambahkan perintah. Ekstensibilitas ini memungkinkan pembuat driver VxD untuk membuat perintah debug khusus yang memberi mereka akses gratis ke informasi di perangkat virtual mereka. Men-debug Versi Windows 98 mendukung banyak perintah DOT yang memungkinkan Anda melihat status sistem operasi yang tepat kapan saja dalam proses debug.

debugger I386KD

Windows 2000 berbeda dari Windows 98 karena bagian debugger mode kernel sebenarnya adalah bagian dari NTOSKRNL. EXE - file kernel utama sistem operasi Sistem Windows 2000. Debugger ini tersedia dalam konfigurasi sistem operasi gratis (rilis) dan teruji (debug). Untuk mengaktifkan debugging mode kernel, setel opsi /DEBUG bootloader ke BOOT. INI dan, secara opsional, opsi bootloader /DEBUGPORT, jika perlu menyetel port komunikasi debugger mode kernel ke nilai selain nilai default (COM1). I386KD berjalan di mesinnya sendiri dan berkomunikasi dengan Mesin jendela 2000 melalui kabel null modem.

Debugger mode kernel NTOSKRNL. EXE hanya melakukan apa yang cukup untuk mengontrol CPU sehingga sistem operasi dapat di-debug. Sebagian besar pekerjaan debugging - penanganan karakter, perpanjangan breakpoint, dan pembongkaran - dilakukan di sisi 1386KD. Satu waktu jendela NT 4 Device Driver Kit (DDK) mendokumentasikan protokol yang digunakan dalam kabel null modem. Namun, Microsoft tidak lagi mendokumentasikannya.

Kekuatan 1386KD terbukti saat Anda melihat semua perintah yang ditawarkannya untuk mengakses keadaan internal Windows 2000. Mengetahui cara kerja driver perangkat di Windows 2000 akan membantu programmer mengikuti keluaran dari banyak perintah. Terlepas dari kekuatannya, i386KD hampir tidak pernah digunakan karena merupakan aplikasi konsol yang sangat membosankan untuk digunakan untuk debugging level sumber.

Saya terkadang mengalami situasi di mana Windows sedang menunggu waktu boot untuk debugger kernel. Anda melihat teks "Windows mulai" tetapi bukan logonya.

Jika saya memasang debugger sekarang, animasi logo Windows 7. Setelah itu, logo mulai berdenyut. Pada titik ini, proses pengunduhan tidak lagi berjalan. Penggunaan CPU dikurangi seminimal mungkin. Saya biasanya menunggu beberapa menit, tetapi tidak ada yang terjadi.

Ini tidak selalu terjadi. Namun, jika ini terjadi, menyetel ulang VM tidak akan membantu. Untuk memperbaiki masalah ini, saya perlu menggunakan perbaikan startup. Sayangnya, ini memakan waktu selamanya.

Ada ide apa yang bisa saya lakukan selain menjalankan perbaikan saat startup?

Terima kasih sebelumnya!

3

2 tanggapan

Untuk memperbaiki masalah yang Anda alami, cukup tekan F10 saat boot. Dan hapus/debug dan opsi terkait. Lalu tekan enter.

Saran: Jangan gunakan opsi /debug untuk opsi menu boot default. Salin konfigurasi boot ke entri baru. Kemudian atur ke mode debug. Windows tidak tahu kapan Anda akan menggunakan debugger. Karena itu ia harus menunggu.

ChPF OELPFPTSCHE HLBBOYS RP TBVPFE U PFMBDLPK SDTB U BCHBTYKOSHCHNY DBNRBNY RBNSFY. LBL RTBCHYMP, CHBN OKHTSOP VKHDEF ЪBDBFSH PDOP YЪ HUFTPKUFCH RPDLBYULY, RETEYUMEOOOSCHI CH ZHBKME /etc/fstab. uVTPU PVTBCHBNY RBNSFY TENTANG KHUFTPKUFCHB, OE SCHMSAEYEUS KHUFTPKUFCHBNY RPDLBYULY, OBRTYNET, MEOFSHCH, CH DBOOSCHK NPNEOF OE RPDDETSYCHBAFUS.

Catatan: YURPMSHЪKhKFE LPNBODH dumpon (8) DMS HLBBOYS SDTH NEUFB, ZDE OHTSOP UPITBOSFSH BCHBTYKOSHCHE DBNRSHCH. rPUME OBUFTPCLY RP LPNBODE bertukar (8) TBDEMB RPDLBYULY DPMTSOB VSCHFSH CHSHCHCHBOB RTPZTBNNB dumpon . PVSHYUOP LFP CHSHCHRPMOSEPHUS BDBOYEN RETENEOOPK dumpdev H JBKME rc.conf (5). eUMMY BDBOB LFB RETENEOOBS, FP RPUME UVPS RTY RETCHPK NOPZPRPMSHPCHBFEMSHULPK RETEEBZTHЪLE VHDEF BCHFPNBFYUEULY BRHEEO RTPZTBNNB savecore(8). pOB UPITBOYF BCHBTYKOSHK DBNR SDTB W LBFBMPZ, JBDBOOSCHK H RETENEOOPC dumpdir JBKMB rc.conf . rp HNPMYUBOYA LBFBMPZPN DMS BCHBTYKOSHCHI DBNRPC SCHMSEFUS /var/crash .

MYVP CH NPCEFE ЪBDBFSH HUFTPKUFCHP DMS UVTPUB PVTBB RBNSFY SCHOP Yuete RBTBNEFT buang CH UFTPL config LPOZHJZHTBGYPOOPZP ZHBKMB CHBYEZP SDTB. fBLPK URPUPV YURPMSHЪPCHBFSH OE TELPNEODHEFUS Y PO DPMTSEO YURPMSHЪPCHBFSHUS, FPMSHLP EUMY CHSH IPFYFE RPMHYUBFSH BCHBTYKOSHCHE PVTBJSCH RBNSFY SDTB, LFPPTPE BCHBTYKOP ЪBCHETYTBYBFSHUCH.

Catatan: dBMEE FETNYO gdb POBUBEF PFMBDUYL gdb , BRHEEOOSCHK H ``TETSYNE PFMBDLY SDTB "". RETEIPD H FFPF TETSIN DPUFYZBEFUS BRHULPN gdb U RBTBNEFTPN -k . h TETSYNE PFMBDLY SDTB gdb YЪNEOSEF UCHPЈ RTYZMBYOEOYE TENTANG (kgdb) .

tip: eUMMY CHSH YURPMSHHEFE FreeBSD CHETUYY 3 YMY VPMEE TBOOAA, CHSH DPMTSOSCH CHSHCHRPMOYFSH HUEYUEOYE PFMBDPYUOPZP SDTB LPNBODPK strip, BOE HUFBOBCHMYCHBFSH VPMSHYPE PFMBDPYUOPE SDTP:

# cp kernel kernel.debug # strip -g kernel

ffpf ybz oe fbl hts y eepvipdyn, op telpneodhen. (чП FreeBSD 4 Й ВПМЕЕ РПЪДОЙИ ТЕМЙЪБИ ЬФПФ ЫБЗ ЧЩРПМОСЕФУС БЧФПНБФЙЮЕУЛЙ Ч ЛПОГЕ РТПГЕУУБ РПУФТПЕОЙС СДТБ make .) лПЗДБ СДТП ХУЕЮЕОП, БЧФПНБФЙЮЕУЛЙ ЙМЙ РТЙ РПНПЭЙ ЛПНБОД ЧЩЫЕ, ЧЩ НПЦЕФЕ ХУФБОПЧЙФШ ЕЗП ПВЩЮОЩН ПВТБЪПН, ОБВТБЧ make install .

ъBNEFSHFE, UFP CH UVBTSCHI CHETUYSI FreeBSD (DP 3.1, OE CHLMOYUBS FFPF TEMYЪ), YURPMSH'HEFUS SDTB CH ZhPTNBFE a.out, RPFPPNH YI FBVMYGSCH UINCHPMCH DPMTSOSH TBURPMBZBFSHUS RBNSFPSOOP. di VPMSHYPK FBVMYGEK UYNCHPMCH CHOE HUEYUEOOOPN PFMBDPYUOPN SDTE LFP YЪMYYOSS FTBFB. rPUMEDOYE TEMYJSHCH FreeBSD YURPMSHJHAF SDTB CH JPTNBFE ELF, DI SINI EFP OE SCHMSEFUS RTPVMENPK.

еУМЙ ​​​​ЧЩ ФЕУФЙТХЕФЕ ОПЧПЕ СДТП, УЛБЦЕН, ОБВЙТБС ЙНС ОПЧПЗП СДТБ Ч РТЙЗМБЫЕОЙЙ ЪБЗТХЪЮЙЛБ, ОП ЧБН ОХЦОП ЪБЗТХЦБФШ Й ТБВПФБФШ У ДТХЗЙН СДТПН, ЮФПВЩ УОПЧБ ЧЕТОХФШУС Л ОПТНБМШОПНХ ЖХОЛГЙПОЙТПЧБОЙА, ЪБЗТХЦБКФЕ ЕЗП ФПМШЛП Ч ПДОПРПМШЪПЧБФЕМШУЛПН ТЕЦЙНЕ РТЙ РПНПЭЙ ЖМБЗБ -s , ХЛБЪЩЧБЕНПЗП РТЙ ЪБЗТХЪЛЕ , Б UBFEN CHSHCHRPMOYFE FBLIE YBZY:

# fsck -p # mount -a -t ufs # agar sistem file Anda untuk /var/crash dapat ditulisi # savecore -N /kernel.panicked /var/crash # exit # ...ke multi-pengguna

uFB RPUMEDPCHBFEMSHOPUFSH HLBSCHCHBEF RTPZTBNNE savecore(8) TENTANG YURPMSH'PCHBOYE DTHZPZP SDTB DMS Y'CHMEYUEOYS UINCHPMYUEULYI YNEO. yOBYUE POB VHDEF YURPMSHЪPCHBFSH SDTP, TBVPFBAEEEE CH DBOOSCHK NPNEOF Y, ULPTEE CHUEZP, OYUEZP OE UDEMBEF, RPFPNH UFP BCHBTYKOSHCHK PVTB RBNSFY Y Uinchpmshch SDTB VHDHF PFMYUB.

b FERETSH, RPUME UVTPUB BCHBTYKOPZP DBNRB, RETEKDYFE H LBFBMPZ /sys/compile/WHATEVER Y BRHUFYFE LPNBODH gdb -k . y RTPZTBNNSC gdb UDEMBKFE CHPF UFP:

File simbol kernel.debug file exec /var/crash/kernel.0 file inti /var/crash/vmcore.0 DTHZPK RTPZTBNNPK.

ChPF TsHTOBM LPNBOD UEBOUB TBVPFShch gdb, YMMAUFTYTHAEYK LFH RTPGEDHTX. dMYOOSH UFTPLY VSCHMY TBPTCHBOSH DMS HMHYUYOYS YUYFBVEMSHOPUFY Y DMS HDPVUFCHB UFTPLY VSCHMY RTPOHNETPCHBOSHCH. CHUE PUFBMSHOPE SCHMSEFUS FTBUUYTPCHLPK PYYVLY, TEBMSHOP CHPOYLOKHCHYEK CHP CHTENS TBVPFSCH OBD DTBCCHETPN LPOUPMY pcvt.

1: Skrip dimulai pada Jum 30 Des 23:15:22 1994 2: # cd /sys/compile/URIAH 3: # gdb -k kernel /var/crash/vmcore.1 4: Membaca data simbol dari /usr/src/ sys/kompilasi/URIAH/kernel ...selesai. 5:IdlePTD 1f3000 6:panik: karena kamu bilang begitu! 7: PCB saat ini di 1e3f70 8: Membaca simbol untuk ../../i386/i386/machdep.c...done. 9: (kgdb) di mana 10:#0 boot (arghowto=256) (../../i386/i386/machdep.c baris 767) 11:#1 0xf0115159 dalam kepanikan () 12:#2 0xf01955bd dalam diediedie ( ) (../../i386/i386/machdep.c baris 698) 13:#3 0xf010185e di db_fncall () 14:#4 0xf0101586 di db_command (-266509132, -266509516, -267381073) 15:#01loop_command_db_1016 () 16:#6 0xf01040a0 di db_trap() 17:#7 0xf0192976 di kdb_trap(12, 0, -272630436, -266743723) 18:#8 0xf019d2eb di trap_fatal (...) 19:#9 0xfault19 ...) 20:#10 0xf019cb2f dalam perangkap (...) 21:#11 0xf01932a1 dalam pengecualian:calltrap () 22:#12 0xf0191503 dalam cnopen (...) 23:#13 0xf0132c34 dalam spec_open () 24: #14 0xf012d014 dalam vn_open () 25:#15 0xf012a183 di buka () 26:#16 0xf019d4eb di syscall (...) 27: (kgdb) naik 10 28: Membaca dalam simbol untuk ../../i386/i386 /trap.c ...Selesai. 29:#10 0xf019cb2f dalam perangkap (frame=(tf_es = -260440048, tf_ds = 16, tf_\ 30:edi = 3072, tf_esi = -266445372, tf_ebp = -272630356, tf_isp = -27\ 31:2630 84, tf_edxed 12, tf_ecx = -266427884, tf\ 32:_eax = 64772224, tf_trapno = 12, tf_err = -272695296, tf_eip = -26\ 33:6672343, tf_cs = -266469368, tf_eflags = 66066, tf_3\2p = 3, tf_3\72 ss = -266427884)) (../../i386/i386/trap.c baris 283) 35:283 (batal) trap_pfault(&bingkai, FALSE); 36: (kgdb) bingkai bingkai->tf_ebp bingkai->tf_eip 37: Membaca dalam simbol untuk ../../i386/isa/pcvt/pcvt_drv.c...selesai. 38:#0 0xf01ae729 di pcopen (dev=3072, flag=3, mode=8192, p=(struct p\ 39:roc *) 0xf07c0c00) (../../i386/isa/pcvt/pcvt_drv.c baris 403) 40:403 kembali ((*linesw.l_open)(dev, tp)); 41: (kgdb) daftar 42:398 43:399 tp->t_state |= TS_CARR_ON; 44:400 tp->t_cflag |= CLOCAL; /* tidak bisa menjadi modem (:-) */ 45:401 46:402 #jika PCVT_NETBSD || (PCVT_FREEBSD >= 200) 47:403 kembali ((*linesw.l_open)(dev, tp)); 48:404 #else 49:405 kembali ((*linesw.l_open)(dev, tp, bendera)); 50:406 #endif /* PCVT_NETBSD || (PCVT_FREEBSD >= 200) */ 51:407 ) 52: (kgdb) cetak tp 53:Membaca dalam simbol untuk ../../i386/i386/cons.c...done. 54:$1 = (struct tty *) 0x1bae 55: (kgdb) cetak tp->t_line 56:$2 = 1767990816 57: (kgdb) naik 58:#1 0xf0191503 di cnopen (dev=0x00000000, flag=3, mode=8192 , p=(st\ 59:ruct proc *) 0xf07c0c00) (../../i386/i386/cons.c baris 126) 60: return ((*cdevsw.d_open)(dev, flag, mode, p) ); 61: (kgdb) naik 62:#2 0xf0132c34 di spec_open () 63: (kgdb) naik 64:#3 0xf012d014 di vn_open () 65: (kgdb) naik 66:#4 0xf012a183 di buka () 67: (kgdb) naik 68:#5 0xf019d4eb di syscall(frame=(tf_es=39, tf_ds=39, tf_edi=\69:2158592, tf_esi=0, tf_ebp=-272638436, tf_isp=-272629788, tf\ 70:_ebx,= = 1 , tf_ecx = 0, tf_eax = 5, tf_trapno = 582, \71:tf_err = 582, tf_eip = 75749, tf_cs = 31, tf_eflags = 582, tf_esp \ 72 := -272638456, tf_ss = 39)) (. ./../i386/i386/trap.c baris 673) kesalahan 73:673 = (*callp->sy_call)(p, args, rval); 74: (kgdb) naik 75: Bingkai awal dipilih; kamu tidak bisa naik. 76: (kgdb) keluar 77: # keluar 78:keluar 79:80:Script selesai pada Jumat 30 Des 23:18:04 1994

lPNNEOFBTYY L CHSHCHYERTYCHEDEOOOPNKH TsHTOBMH:

UFTPLB 6:

yFP DBNR, CHJSFC RTY RPNPEY DDB (UNPFTY OYCE), RPFPNH LPNNEOFBTYK L BCHBTYKOPNH PUFBOPCH YNEEF YNEOOP CHYD ``Karena kamu bilang begitu! PDOBLP YOBYUBMSHOPK RTYUYOPK RETEIPDB CH DDB VSCHMB BCHBTYKOBS PUFBOPCHLB RTY CHPOYOLOPCHEOYA PYYVLY UFTBOIGSC RBNSFY.

UFTPLB 20:

ffp NEUFPOBIPTSDEOYE JHOLGYY trap() H FTBUUYTPCHLE UFEBL.

UFTPLB 36:

rTYOHDYFEMSHOPE YURPMSH'PCHBOYE OPCHPK ZTBOYGSCH UFEBL; FERESH FF OE OHTSOP. rTEDRPMBZBEFUUS, UFP ZTBOYGSC UFELB HLBSCCHCHBAF TENTANG RTBCHIMSHOPE TBURPMPTSEOYE, DBTSE CH UMHYUBE BCHBTYKOPZP PUFBOPCHB. ZMSDS TENTANG UFTPLH YUIPDOPZP LPDB 403, NPTsOP ULBBFSH, UFP CHEUSHNB CHETPSFOP, UFP MYVP CHYOPCHBF DPUFHR RP HLBBFEMA ``tp "", MYVP VSCHM CHSHHIPD IB ZTBOYGSCH NBUUYCHB.

UFTPLB 52:

RPIPTSE, UFP CHYOPCHBF HLBBFEMSH, OP OLEH SCHMSEFUS DPRHUFYNSCHN BDTEUPN.

UFTPLB 56:

pDOBLP, PYUECHIDOP, UFP DI HLBSCHCHBEF TENTANG NHUPT, FBL UFP NSC OBYMY UMUM PYYVLH! (DMS FEI, LFP OE OBBLPN U YFPK YUBUFSHHA LPDB: tp->t_line UMHTSYF DMS ITBOOEOYS TETSYNB LBOBMB LPOUPMSHOPZP HUFTPKUFCHB, Y LFP DPMTSOP VShFSH DPUFBFPYuOP NBMEOSHLPE GEMPE YUYUMP.)

Rangkaian artikel ini muncul karena dua alasan. Pertama, saya suka bekerja dengan proyek HackSysExtremeVulnerableDriver. Kedua, saya dapat banyak keinginan untuk menyoroti topik ini.

Semua kode yang digunakan dalam penulisan seri ini ada di .

DI DALAM siklus ini Pada artikel ini, kita akan melihat cara menulis eksploit tingkat kernel di OS Windows. Penting untuk dicatat bahwa kita akan berurusan dengan kerentanan yang diketahui dan tidak diperlukan rekayasa balik (setidaknya tidak untuk driver).

Diasumsikan bahwa setelah membaca semua artikel, Anda akan mengetahui semua kelas pelanggaran dan metode eksploitasi yang paling umum, serta dapat memindahkan eksploitasi dari arsitektur x86 ke arsitektur x64 (jika memungkinkan) dan membiasakan diri dengan perlindungan baru metode di Windows 10.

Skema debug kernel

Tidak seperti debugging tingkat pengguna, ketika satu proses ditangguhkan, seluruh sistem terlibat di tingkat kernel, dan kami tidak akan dapat menggunakan metode ini. Oleh karena itu, diperlukan mesin debug terpisah yang dapat berkomunikasi dengan sistem di mana kernel sedang di-debug, melihat memori dan struktur kernel, dan juga menangkap sistem yang mogok.

Bahan tambahan untuk dipelajari:

Eksploitasi kerentanan kernel

Proses ini jauh lebih menyenangkan daripada eksploitasi tingkat pengguna J.

Tujuan utamanya adalah untuk mencapai eksekusi istimewa dalam konteks kernel. Dan kemudian semuanya tergantung pada imajinasi kita, mulai dari pesta dengan bir buatan sendiri dan diakhiri dengan pengenalan malware yang disponsori negara.
Secara umum, tugas kita adalah mendapatkan shell dengan hak istimewa sistem.

Topik artikel dalam seri ini

  • Bagian 1: Menyiapkan lingkungan kerja
    • Konfigurasi tiga mesin virtual dan sistem yang akan bertindak sebagai debugger.
    • Mengkonfigurasi debugger WinDBG.
  • Bagian 2: Muatan
    • Jelajahi muatan yang paling umum. Bagian selanjutnya akan membahas kerentanan tertentu dan memberikan tautan ke artikel ini jika perlu.
  • Sisa bagian.
    • Pertimbangan kerentanan.

Siklus hidup pengembangan eksploitasi tingkat kernel

  • Menemukan kerentanan. Topik ini tidak akan dibahas dalam seri ini, karena kita sudah tahu persis di mana celahnya.
  • Mencegat aliran eksekusi. Beberapa kerentanan melibatkan eksekusi kode, beberapa memiliki persyaratan tambahan.
  • Perluasan Hak Istimewa. Tujuan utamanya adalah mendapatkan shell dengan hak istimewa sistem.
  • Mengembalikan aliran eksekusi. Pengecualian yang tidak tertangani pada tingkat kernel menyebabkan sistem macet. Jika Anda tidak akan menulis eksploit untuk serangan DoS, Anda harus mempertimbangkan fakta ini.

Jenis sistem target

Kami akan bekerja dengan kerentanan dalam sistem berikut (versi spesifik tidak kritis):

  • Win7 x86 VM
  • Win7 x64 VM
  • Win10 x64 VM

Mari kita mulai dengan arsitektur x86, lalu kita akan mem-port exploit ke sistem Win7 x64. Beberapa eksploit tidak akan berjalan di mesin Win10 karena adanya perlindungan baru. Dalam hal ini, kami akan mengubah logika eksploit, atau kami akan menggunakan pendekatan yang sama sekali berbeda.

Perangkat lunak yang digunakan:

  • Hypervisor (banyak pilihan).
  • Windows 7 x86 VM
  • Windows 7 x64 VM
  • VM Windows 10 x64

Menyiapkan sistem untuk debugging

Sistem debug yang akan berinteraksi dengan kami dirancang untuk memuat driver yang rentan. Kerusakan akan sering terjadi pada mesin ini, karena sebagian besar pengecualian pada kernel berkontribusi terhadap hal semacam ini. Perlu untuk mengalokasikan cukup memori akses acak untuk sistem ini.

Pada setiap mesin yang akan di-debug, Anda perlu melakukan hal berikut:

  • Di dalam direktori VirtualKD, jalankan file target\vminstall.exe. Yang baru akan ditambahkan catatan boot dan fungsi debugging dan koneksi otomatis ke server VirtualKD yang diinstal pada sistem yang bertindak sebagai debugger akan tersedia.

Dalam kasus Windows 10 VM harus diaktifkan modus uji penandatanganan, yang memungkinkan driver yang tidak ditandatangani dimuat ke dalam kernel.

Setelah menjalankan bcdedit /set testinging on command dan reboot, "Test Mode" akan muncul di desktop.

Deskripsi singkat tentang modul HEVD

Prosedur DriverEntry adalah prosedur awal untuk setiap driver:

NTSTATUS DriverEntry(DI PDRIVER_OBJECT DriverObject, DI PUNICODE_STRING RegistryPath) (
UINT32 i = 0;
PDEVICE_OBJECT DeviceObject = NULL;
Status NTSTATUS = STATUS_UNSUCCESSFUL;
UNICODE_STRING DeviceName, DosDeviceName = (0);

UNREFERENCED_PARAMETER(RegistryPath);
PAGED_CODE();

RtlInitUnicodeString(&DeviceName, L"\\Device\\HackSysExtremeVulnerableDriver");
RtlInitUnicodeString(&DosDeviceName, L"\\DosDevices\\HackSysExtremeVulnerableDriver");

// Buat perangkat
Status = IoCreateDevice(DriverObject,
0,
&Nama perangkat,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
PALSU,
&DeviceObject);

  • Prosedur ini berisi pemanggilan fungsi IoCreateDevice yang berisi nama driver yang akan kita gunakan selama komunikasi.
  • Struktur dan penunjuk yang diperlukan ke fungsi akan ditambahkan ke objek DriverObject.
  • Yang penting bagi kami adalah pointer fungsi yang terkait dengan prosedur DriverObject->MajorFunction , yang bertanggung jawab untuk menangani IOCTL (Kontrol I / O; kontrol input / output);
  • Di HEVD, fungsi ini disebut IrpDeviceIoCtlHandler , yang merupakan ekspresi kondisional besar dengan banyak cabang untuk setiap IOCTL. Setiap kerentanan memiliki IOCTL unik.

Contoh: HACKSYS_EVD_IOCTL_STACK_OVERFLOW adalah IOCTL yang digunakan untuk memicu kerentanan stack overflow.

Ini menyimpulkan bagian pertama. Pada artikel selanjutnya, kita akan membahas tentang payload. Pada saat ini hanya payload pencuri token yang tersedia, yang akan digunakan di bagian ketiga.

P.S. Saya mengerti bahwa ada banyak kehalusan dan masalah yang mungkin Anda temui. Karena siklus ini berfokus pada pengembangan eksploit, Anda harus menyelesaikan sendiri semua masalah di sepanjang jalan. Namun, Anda dapat mengajukan pertanyaan apa pun yang Anda miliki di komentar.



Memuat...
Atas