This is how to break into Mrxnet.sys to perform dynamic analysis on Stuxnet:
1) start windbg and hit ctrl+k to attach to a kernel.
2) start the VM with Suxnet installed on it
3) manually break(ctrl+break) As Soon As Possible in the boot sequence.
4) “sxe ld:mrxnet” it’s not a very well known fact that an exception is thrown upon driver load (probably to make debugging easier), and then caught so we don’t have an unhandled exception. This command breaks when an exception is thrown during the loading of the mrxnet module.
5) ‘g’ this will continue execution of the VM until the above exception is thrown
6) “!dh mrxnet”. This will list information about the mrxnet module, including the address of the entry point. Below is the output (notice the value of “address of entry point”):
kd> !dh mrxnet File Type: EXECUTABLE IMAGE FILE HEADER VALUES 14C machine (i386) 6 number of sections 4B5DAD1C time date stamp Mon Jan 25 09:39:24 2010 0 file pointer to symbol table 0 number of symbols E0 size of optional header 102 characteristics Executable 32 bit word machine OPTIONAL HEADER VALUES 10B magic # 8.00 linker version 1B00 size of code A00 size of initialized data 0 size of uninitialized data 2005 address of entry point 480 base of code ----- new ----- 00010000 image base 80 section alignment 80 file alignment 1 subsystem (Native) 6.00 operating system version 6.00 image version 5.00 subsystem version 2980 size of image 480 size of headers 8352 checksum 00040000 size of stack reserve 00001000 size of stack commit 00100000 size of heap reserve 00001000 size of heap commit 0 DLL characteristics 0 [ 0] address [size] of Export Directory 2044 [ 28] address [size] of Import Directory 2380 [ 3F8] address [size] of Resource Directory 0 [ 0] address [size] of Exception Directory 2980 [ 1A78] address [size] of Security Directory 2780 [ 154] address [size] of Base Relocation Directory 1C70 [ 1C] address [size] of Debug Directory 0 [ 0] address [size] of Description Directory 0 [ 0] address [size] of Special Directory 0 [ 0] address [size] of Thread Storage Directory 1D38 [ 40] address [size] of Load Configuration Directory 0 [ 0] address [size] of Bound Import Directory 1C00 [ 70] address [size] of Import Address Table Directory 0 [ 0] address [size] of Delay Import Directory 0 [ 0] address [size] of COR20 Header Directory 0 [ 0] address [size] of Reserved Directory
SECTION HEADER #1 .text name 1736 virtual size 480 virtual address 1780 size of raw data 480 file pointer to raw data 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 68000020 flags Code Not Paged (no align specified) Execute Read
SECTION HEADER #2 .rdata name 2B4 virtual size 1C00 virtual address 300 size of raw data 1C00 file pointer to raw data 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 48000040 flags Initialized Data Not Paged (no align specified) Read Only
Debug Directories(1) Type Size Address Pointer cv 44 1d80 1d80 Format: RSDS, guid, 1, b:\myrtus\src\objfre_w2k_x86\i386\guava.pdb
SECTION HEADER #3 .data name A0 virtual size 1F00 virtual address 100 size of raw data 1F00 file pointer to raw data 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers C8000040 flags Initialized Data Not Paged (no align specified) Read Write
SECTION HEADER #4 INIT name 302 virtual size 2000 virtual address 380 size of raw data 2000 file pointer to raw data 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers E2000020 flags Code Discardable (no align specified) Execute Read Write
SECTION HEADER #5 .rsrc name 3F8 virtual size 2380 virtual address 400 size of raw data 2380 file pointer to raw data 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 42000040 flags Initialized Data Discardable (no align specified) Read Only
SECTION HEADER #6 .reloc name 1B8 virtual size 2780 virtual address 200 size of raw data 2780 file pointer to raw data 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 42000040 flags Initialized Data Discardable (no align specified) Read Only
7) once the exception in part 4 is thrown, a breakpoint was set on the entry point of mrxnet module by using “bp mrxnet+2005”. This command sets a software breakpoint at 0x2005 bytes past the base of the mrxnet module. As seen in step 6, the “address of entry point” of mrxnet.sys is 0x2005.
8) ‘g’
9) now, the VM execution should stop at the entry point of the mrxnet module:
Screenshot of a debugger broken in mrxnet.sys
This is the disassembly of DriverEntry in mrxnet.sys as shown in IDA. Notice, it is the same as the disassembly shown in the above windbg screenshot.
By: Neil Sikka