nsiz 发表于 2009-7-9 16:16:31

冰河暗涌防不胜防 BIOS下实现的Telnet后门

NT内核被加载高端的2GB内存(80000000h~0ffffffffh)。参看NT内存安排..
a、win2k adv ser:   WINDBG 看到 NT Kernel base = 0x80400000 也就是NTOSKRNL.exe加载位置
         kd> r @cr3      ;断点位置在NTOSKRNL.exe里现在还没有应用程序故低端内存还未使用
            cr3=00030000 ;->页目录表所在物理页(物理地址30000h)
          kd> d 80030000 80030800;看页目录发现现在低端2GB(0~80000000h)还未分配
            8003000000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................
            8003001000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................
            8003002000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................
                  
          kd> d 80030800         ;看高端开始分配情况页表(80000000h开始的分配情况)
            8003080063 21 03 00 63 41 03 00-63 51 03 00 63 31 03 00c!..cA..cQ..c1..
            8003081063 11 7c 00 63 21 7c 00-63 31 7c 00 63 41 7c 00c.|.c!|.c1|.cA|.
            8003082063 51 7c 00 63 61 7c 00-63 71 7c 00 63 81 7c 00cQ|.ca|.cq|.c.|.
          ;实例1:看80400000h(NT Kernel base),这个线性地址到物理地址映射情况.
            ;线性地址最高10位页目录项(每项占4Byte):80400000h最高10位=201h.
            ;在页目表位置:201h*4=804h 在内存地址=+804h..具体看保护模式教程
            kd> d 80030000+804 ;看在页目录表位置的值
                8003080463 41 03 00 63 51 03 00-63 31 03 00 63 11 7c 00cA..cQ..c1..c.|.

            ;二级页表所在物理页地址:63 41 03 00转换下34163h,物理页地址:34000h,163h是页属性.
            kd> d 80034000   ;看在页表的值
                8003400063 01 40 00 63 11 40 00-63 21 40 00 63 31 40 00c.@.c.@.c!@.c1@.

            ;物理地址基址:63 01 40 00转换下400163h,#物理地址基址#:400000h,163h是页属性
            ;最后发现物理地址基址(页地址)在400000h..观察物理地址400000h是NTOSKRNL.exe映像.

            kd> d 80400000 ;观察物理地址400000h
                804000004d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00MZ..............
                80400010b8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00........@.......

         ;实例2:看我们代码映射情况我们代码在物理地址:9e000h从线性地址8009e000h分析映射情况
            ;8009e000h在页目录位置最高10位=200h*4,在内存地址=+200h*4...
            kd> d 80030000+200*4
                8003080063 21 03 00 63 41 03 00-63 51 03 00 63 31 03 00c!..cA..cQ..c1..

               ;二级页表对应物理地址:63 21 03 00转换下物理页基址=32000h ,163是页属性
               ;8009e000h所在二级页表位置:32000h+9eh*4(8009e000h线性地址12~22的位)...
                kd> d 80032000 + 9e *4
                  8003227823 e1 09 00 03 f1 09 00-03 01 0a 00 03 11 0a 00#...............

               ;物理地址基址(页基址):23 e1 09 00转换下09e000h,123是页属性..

          ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.
               kd> d 80030000 + c00 ;计算略.页目录表位置,观察发现指向自己的...
               80030c0067 00 03 00 63 00 f0 17-00 00 00 00 63 31 a9 02g...c.......c1..

b、winXP:WINDBG 看到 Kernel base = 0x804d8000 PsLoadedModuleList = 0x8055b420
          kd> r @cr3   ;断点位置在NTOSKRNL.exe里现在还没有应用程序故低端内存还未使用
               cr3=00039000 ;->页目录表所在物理页(页目录物理地址30000h)
                  
               kd> d 80039000 80039800;看页目录发现现在低端2GB(0~80000000h)还未分配
               8003900000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................

               kd> d 80039800         ;看高端开始分配情况页表(80000000h开始的分配情况)
               80039800e9 b9 00 f6 06 a1 08 10-75 1b f6 06 a3 08 10 75........u......u

          ;实例1:看我们代码映射情况我们代码在物理地址:9e000h从线性地址8009e000h分析映射情况
               ;8009e000h在页目录位置最高10位=200h*4,在内存地址=+200h*4...
               kd> d 80039000+200*4
                   8003980063 b1 03 00 e3 01 40 00-63 e1 03 00 e3 01 00 01c.....@.c.......

               ;二级页表对应物理地址:63 b1 03 00转换下物理页基址=3b000h ,163是页属性
               ;8009e000h所在二级页表位置:3b000h+9eh*4(8009e000h线性地址12~22的位)...
               kd> d 8003b000 + 9e *4
                   8003b27803 e1 09 00 03 f1 09 00-03 01 0a 00 03 11 0a 00................

                ;物理地址基址(页基址):03 e1 09 00转换下09e000h,103是页属性..
--------->;*#实例2:手工修改分页让物理地址映射到线性地址,WINXP.80000000h BIOS/dos向量区没映射.#*
               kd> d 80000000;可看到现在没映射的情况,无法通过线性地址访问.
                   80000000?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??????????????????
                   80000010?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ??????????????????

               ;80000000h的最高10位确定在页目录表位置=200h*4=800h.在页目录物理地址:+800h
                   kd> d 80039000+200*4;可发现二级页表已映射(63b10300)页属性163.物理地址(页)3b000h
                     8003980063 b1 03 00 e3 01 40 00-63 e1 03 00 e3 01 00 01c.....@.c.......
                     
                     ;80000000h的12~22位次高10位确定在二级页表位置:物理地址3b000h+0*4
                   kd> d 8003b000;观察发现确实没映射.全0.注意:一个页项占4字节...
                     8003b00000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00................

                   ;修改成让它对应物理地址:000就可以,只修改允许访问就可以.也就是byte ptr =63
                     kd> e 8003b000 63
                     kd> d 8003b000;修改成功
                     8003b00063 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00c...............

                   ;观察修改后的情况.;注意:要想设置生效.让WINDBG执行下G.让0C0000000等cr3被改等..
                     kd> g      ;让系统自动刷新TLB等寄存器....
                     kd> d 80000000
                     8000000053 ff 00 f0 53 ff 00 f0-c3 e2 00 f0 53 ff 00 f0S...S.......S...

          ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.
                kd> d 80039000 + c00 ;计算略.页目录表位置,观察发现指向自己的...
                  80039c0067 90 03 00 63 00 f0 0f-00 00 00 00 63 31 e2 01g...c.......c1..

c、分析以上总结:发现最开始获取的cr3值一直在用。
故我们修改页项的效果会在windows运行后也生效通过以上的实例分析可以看出NT系统的页映射情况。
进入保护模式之后这个CR3的值也就是页目录表位置被映射到了虚拟地址0c0000000h。上面调试的实例页目录表地址就可以直接使用这个虚地址。

本篇文章来源于 新世纪网安基地 (www.520hack.com) 原文出处:http://www.520hack.com/Article/Text2/200903/13723.html
页: [1]
查看完整版本: 冰河暗涌防不胜防 BIOS下实现的Telnet后门