也想出现在这里? 联系我们

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

作者 : 小编 本文共7636个字,预计阅读时间需要20分钟 发布时间: 2021-06-4 共1.14K人阅读
也想出现在这里? 联系我们

该项目仅为实验性项目,主要目的是想隐藏一个Telnet后门在主板的BIOS内,并让其随着计算机系统及操作系统成功的运行起来。运行后能反向Telnet连接到指定的计算机接受控制。

项目涉及的相关知识及技术目录

1、 实验环境,使用bochs调试工具。

2、 刷新BIOS技术问题。

3、 代码植入BIOS问题。

4、 源代码相关技术问题:

A、如何编写BIOS模块(如:PCI、 ISA)。

B、实模式关于HOOK磁盘中断的问题。

C、磁盘中断中选择再次HOOK的问题。

D、NT保护模式下设置物理地址映射

E、NT保护模式下线性地址寻址问题。

BIOS模块调试实验环境采用Bochs

Bochs虚拟机可以调试BIOS及操作系统,Bochs使用主要是配置它的配置文件,我们以实例配置文件简单讲解,Bochs实验调试等网上有很多相关文章,这里简单讲解。

我的配置实例:文件名xp.bxrc,修改后的及需要设置的内容如下:

  1. ######使用的系统BIOS模块######
  2. romimage:file=$BXSHARE/BIOS-bochs-latest
  3. ######使用的CPU相关参数######
  4. cpu:count=1,ips=10000000,reset_on_triple_fault=1
  5. ######设置内存大小######
  6. megs:128
  7. ######添加我们的BIOS模块######
  8. optromimage1:file=test.bin,address=0xd0000
  9. ######使用的VGAROM模块######
  10. vgaromimage:file=$BXSHARE/VGABIOS-lgpl-latest
  11. ######设置虚拟机硬盘与光盘######
  12. ata0-master:type=disk,path="c.img",mode=flat,cylinders=4161,heads=16,spt=63
  13. #ata0-slave:type=cdrom,path="xp.iso",status=inserted
  14. ######设置引导设备######
  15. boot:c
  16. #boot:cdrom,disk

Bochs调试加载配置文件方法:可以设置一个bat文件,如下内容:set BXSHARE=d:\\bochs%BXSHARE%\\bochsdbg.exe -q -f xp.bxrc

如何刷新各种BIOS问题

各种BIOS刷新相关工具早已在网上流传,工具的使用这里不作介绍,IcLord的作者已经给出很多编程方法实现。这里简单说下。

UniFlash开源项目我也详细分析过,如果有必要我会给出UniFlash源代码的详解,该项目指出可以刷写所有BIOS芯片,但是该项目刷新BIOS存在很多问题,绝大多数情况是无法刷新的我实验过很多次,也尝试修改他的代码过很多次,没找到原因。

Aword BIOS已经有通用的刷写API调用,不管在NT下还是在实模式下,IcLord也作了讲解。如果有时间我会给出实模式及NT下的刷写源代码及分析。

代码植入BIOS问题

关于网上提及的,IcLord讲到的我就不再做重复的分析。这里主要讲下我们的模块可以植入哪些地方以方便隐藏。以前的教程讲过的方法存的问题分析。一、 ISA模块形式植入:这种方式只适合于较早的计算机,因为目前的计算机系统BIOS是不会加载ISA模块的。故只能做实验调试用的方法。二、 PCI模块形式植入:该方法虽然系统BIOS都要加载PCI ROM,但是系统BIOS只加载实际存在的PCI卡的ROM模块。而且通常BIOS设置中可以关闭相应的ROM启动。三、 HOOK BootBlock或者说要启动的模块:该方法当然我认为是最有效的,但是又存在很多技术上的难题。检验和问题,不同BIOS的结构问题,过早的HOOK还存在再次获取CPU运行机会问题等等。

本人实验过以上提及的所有方法,我认为HOOK PCI、VGA及相关启动模块是比较可寻的办法。为什么?一般这类的ROM模块是必须启动的,而且调试发现一般它的ROM本身代码用不完自身设置的大小,我们可以借助剩余大小隐藏我们的代码。例如:集成显卡会把显卡ROM集成到系统BIOS模块中,我们可以对该模块进行HOOK,修改ROM头部的跳转指令,跳到我们的代码开始处执行,我们的代码执行完后跳转到它的代码开始处执行。

如何编写BIOS模块

BIOS是分模块组合在一起的。这里对PCI及ISA模块作下简单分析,VGA模块跟PCI模块几乎一样。模块主要是头部有个规范,该规范适合所有BIOS系统。具体可以参看《PCI系统结构》及其他书籍。

源代码实例可以参看国外ROMOS开源项目,该开源项目的思想很值得学习。该项目讲解了如何在BIOS中嵌入一个小型DOS,如:FreeDos。采用了把整个DOS系统盘镜像植入BIOS中,跟早期的PXE引导DOS机制类似,然后HOOK磁盘中断,模拟DOS系统盘镜像出一个盘,源代码编译后只有900多字节。这种思想在早期还是很值得学习的。实模式关于HOOK磁盘中断问题

很早前就有业界内人士发贴问,为什么在我的ROM模块中HOOK磁盘中断会失败呢?关于这个问题现在目前网上已经有人作出过回答,国外的开源项目在2003年我都看到过。

由于我们的ROM模块过早的运行,可能运行在磁盘服务前面了,这时如果HOOK Int 13h会因为BIOS加载磁盘服务时重写Int 13h IVT值,故我们设法HOOK其他服务,这个服务要求较早被BIOS安装且不会再次修改且加载操作系统前调用,最佳的这个服务选择就是int 18h、int19h服务。可以参看BIOS源代码,也可以参看PXE SDK说明文档略有讲过。

我们的磁盘服务代码建议放在实模式高端内存,通过BIOS数据区域可修改,内存40:13,即物理地址413h处的值。降低常规内存值,高端的内存就留给我们用。我们的保护模式下运行的代码建议也放在这段内存,且要求放在以页基址开始的内存中,以便后面代码的页映射我们的保护模式代码物理页。页基址:内存物理页地地址开始的低12位为零,参看《80386保护模式教程》。

若我们的代码直接在内存的ROM映射区内,可能导致在NT下访问不到我们的代码,因为NT内核加载程序ntldr可能不会映射该段内存,甚至可能BIOS在使用后都会关闭ROM区域这段内存,而且ROM区域这段内存在初始化后被系统BIOS设置成只读不能写。当然我们可以采取用int 15h服务对ROM区域这段内存映射。

当然也可以在NT启动过程中,在我们的磁盘服务中对想映射的内存都映射。由于代码大小的限制,故有些没必要的代码。尽量不使用了。

磁盘中断服务中再次HOOK问题

为了使我们的程序再次获得CPU运行机会,我们不得不得再次设法。调试发现NTLDR进入保护模式后在加载NT内核文件时,会切换CPU到实模式调用Int 13H服务进行磁盘读。

我们挂接磁盘服务就是为了截取NTLDR的读操作,这里我们可以HOOK 或者修改NTLDR另一部分OsLoader的代码,跳转到我们的代码执行。当然也可以直接HOOK ntosknrl导出的服务,参看我在2008.4.1发布的“程序从DOS/BIOS驻留内存到WINNT下监视内存数据”。

注意,HOOK OsLoader的代码时选择HOOK指令问题,由于NTLDR切换到实模式读取数据,读完后会在保护模式下搬移数据到规划位置,进行内核的安装。故HOOK时选择HOOK指令就选择FFh/15h:使用CALL NEAR [OFS32]指令进行,该指令寻址采用绝对地址,类似指令也可以。

当然我们的代码再次运行就会运行在OsLoader代码被我们HOOK处,调用我我们的代码执行,这时我们的代码运行环境:DS = ES = 10h保护模式段,内存模式: FLAT。在这里我们可以通过扫描_BlLoaderData数据结构,获取NTOSKRNL镜像基址。

可以通过PE搜索NTOSKRNL导出的API,可以参看网上相关教程。现在再次HOOK NTOSKRNL导出函数KeAddSystemServiceTable,HOOK该函数可以截获win32k.sys添加它自己的服务,以便我们再再次HOOk win32.sys导出函数NtUserRegisterClassExWOW。HOOK该函数可以截取所有应用层程序注册窗口类,以便我们再再再次HOOK窗口类过程。这时我们的代码就运行在NT的应用层模式下。NT保护模式下设置物理地址映射

先看一个WinDbg实例关于在我们的磁盘服务中获取CR3值修改页映射的分析,以前我的分析内容:

  1. NT内核被加载高端的2GB内存(80000000h~0ffffffffh)。参看NT内存安排..
  2. a、win2kadvser:WINDBG看到NTKernelbase=0x80400000也就是NTOSKRNL.exe加载位置
  3. kd>r@cr3;断点位置在NTOSKRNL.exe里现在还没有应用程序故低端内存还未使用
  4. cr3=00030000;->页目录表所在物理页(物理地址30000h)
  5. kd>d8003000080030800;看页目录发现现在低端2GB(0~80000000h)还未分配
  6. 800300000000000000000000-0000000000000000................
  7. 800300100000000000000000-0000000000000000................
  8. 800300200000000000000000-0000000000000000................
  9. kd>d80030800;看高端开始分配情况页表(80000000h开始的分配情况)
  10. 800308006321030063410300-6351030063310300c!..cA..cQ..c1..
  11. 8003081063117c0063217c00-63317c0063417c00c.|.c!|.c1|.cA|.
  12. 8003082063517c0063617c00-63717c0063817c00cQ|.ca|.cq|.c.|.
  13. ;实例1:看80400000h(NTKernelbase),这个线性地址到物理地址映射情况.
  14. ;线性地址最高10位页目录项(每项占4Byte):80400000h最高10位=201h.
  15. ;在页目表位置:201h*4=804h在内存地址=[cr3]+804h..具体看保护模式教程
  16. kd>d80030000+804;看在页目录表位置的值
  17. 800308046341030063510300-6331030063117c00cA..cQ..c1..c.|.
  18. ;二级页表所在物理页地址:63410300转换下34163h,物理页地址:34000h,163h是页属性.
  19. kd>d80034000;看在页表的值
  20. 800340006301400063114000-6321400063314000c.@.c.@.c!@.c1@.
  21. ;物理地址基址:63014000转换下400163h,#物理地址基址#:400000h,163h是页属性
  22. ;最后发现物理地址基址(页地址)在400000h..观察物理地址400000h是NTOSKRNL.exe映像.
  23. kd>d80400000;观察物理地址400000h
  24. 804000004d5a900003000000-04000000ffff0000MZ..............
  25. 80400010b800000000000000-4000000000000000........@.......
  26. ;实例2:看我们代码映射情况我们代码在物理地址:9e000h从线性地址8009e000h分析映射情况
  27. ;8009e000h在页目录位置最高10位=200h*4,在内存地址=[CR3]+200h*4...
  28. kd>d80030000+200*4
  29. 800308006321030063410300-6351030063310300c!..cA..cQ..c1..
  30. ;二级页表对应物理地址:63210300转换下物理页基址=32000h,163是页属性
  31. ;8009e000h所在二级页表位置:32000h+9eh*4(8009e000h线性地址12~22的位)...
  32. kd>d80032000+9e*4
  33. 8003227823e1090003f10900-03010a0003110a00#...............
  34. ;物理地址基址(页基址):23e10900转换下09e000h,123是页属性..
  35. ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.
  36. kd>d80030000+c00;计算略.页目录表位置,观察发现指向自己的...
  37. 80030c00670003006300f017-000000006331a902g...c.......c1..
  38. b、winXP:WINDBG看到Kernelbase=0x804d8000PsLoadedModuleList=0x8055b420
  39. kd>r@cr3;断点位置在NTOSKRNL.exe里现在还没有应用程序故低端内存还未使用
  40. cr3=00039000;->页目录表所在物理页(页目录物理地址30000h)
  41. kd>d8003900080039800;看页目录发现现在低端2GB(0~80000000h)还未分配
  42. 800390000000000000000000-0000000000000000................
  43. kd>d80039800;看高端开始分配情况页表(80000000h开始的分配情况)
  44. 80039800e9b900f606a10810-751bf606a3081075........u......u
  45. ;实例1:看我们代码映射情况我们代码在物理地址:9e000h从线性地址8009e000h分析映射情况
  46. ;8009e000h在页目录位置最高10位=200h*4,在内存地址=[CR3]+200h*4...
  47. kd>d80039000+200*4
  48. 8003980063b10300e3014000-63e10300e3010001c.....@.c.......
  49. ;二级页表对应物理地址:63b10300转换下物理页基址=3b000h,163是页属性
  50. ;8009e000h所在二级页表位置:3b000h+9eh*4(8009e000h线性地址12~22的位)...
  51. kd>d8003b000+9e*4
  52. 8003b27803e1090003f10900-03010a0003110a00................
  53. ;物理地址基址(页基址):03e10900转换下09e000h,103是页属性..
  54. --------->;*#实例2:手工修改分页让物理地址映射到线性地址,WINXP.80000000hBIOS/DOS向量区没映射.#*
  55. kd>d80000000;可看到现在没映射的情况,无法通过线性地址访问.
  56. 80000000????????????????-????????????????????????????????
  57. 80000010????????????????-????????????????????????????????
  58. ;80000000h的最高10位确定在页目录表位置=200h*4=800h.在页目录物理地址:[cr3]+800h
  59. kd>d80039000+200*4;可发现二级页表已映射(63b10300)页属性163.物理地址(页)3b000h
  60. 8003980063b10300e3014000-63e10300e3010001c.....@.c.......
  61. ;80000000h的12~22位次高10位确定在二级页表位置:物理地址3b000h+0*4
  62. kd>d8003b000;观察发现确实没映射.全0.注意:一个页项占4字节...
  63. 8003b0000000000000000000-0000000000000000................
  64. ;修改成让它对应物理地址:000就可以,只修改允许访问就可以.也就是byteptr[8003b000]=63
  65. kd>e8003b00063
  66. kd>d8003b000;修改成功
  67. 8003b0006300000000000000-0000000000000000c...............
  68. ;观察修改后的情况.;注意:要想设置生效.让WINDBG执行下G.让0C0000000等cr3被改等..
  69. kd>g;让系统自动刷新TLB等寄存器....
  70. kd>d80000000
  71. 8000000053ff00f053ff00f0-c3e200f053ff00f0S...S.......S...
  72. ;#实例3:Windows运行起后用的页目录表线性地址:0c0000000h映射到物理地址情况.
  73. kd>d80039000+c00;计算略.页目录表位置,观察发现指向自己的...
  74. 80039c00679003006300f00f-000000006331e201g...c.......c1..
  75. c、分析以上总结:发现最开始获取的cr3值一直在用。
  76. 故我们修改页项的效果会在windows运行后也生效通过以上的实例分析可以看出NT系统的页映射情况。
  77. 进入保护模式之后这个CR3的值也就是页目录表位置被映射到了虚拟地址0c0000000h。
  78. 上面调试的实例页目录表地址就可以直接使用这个虚地址。

例如:在我们的代码中把我们的代码拷贝到SharedUserData空间未使用处去,就使用了页映射代码,直接修改第一个页指向的物理页,就是我们代码所在的物理页。

NT保护模式下线性地址寻址问题

关于我们的代码进入保护模式以后,所有指令的寻址问题,这里作一下分析。当我们代码第一个在保护模式下执行的指令,是前面提到的磁盘服务中对OsLoader的代码进入HOOK,也提到了采用什么样的HOOK指令以便寻址。

接哪之后,我们的代码就开始运行在保护模式未分页情况下,我们采取的方法是把我们的代码拷贝到SharedUserData空间未使用处,涉及到拷贝的指令也必须运行在保护模式分页下,因为SharedUserData空间是一个虚地址。

在这里我们采用了把我们的拷贝代码指令搬移到NTOSKRNL镜像的MZ与PE之间的区域,设置HOOK NTOSKRNL导出函数KeAddSystemServiceTable首先跳转到拷贝指令执行,HOOK NTOSKRNL导出函数KeAddSystemServiceTable采用相对跳转指令它们在同一个空间。

当我们的拷贝指令把我们的代码拷贝到SharedUserData空间未使用处之后,我们的代码就有一个固定的虚地址,所有后续指令都可以采用这个虚地址进行寻址。

1. 本站所提供的源码模板(主题/插件)等资源仅供学习交流,若使用商业用途,请购买正版授权,否则产生的一切后果将由下载用户自行承担,有部分资源为网上收集或仿制而来,若模板侵犯了您的合法权益,请来信通知我们(Email: rayer@88.com),我们会及时删除,给您带来的不便,我们深表歉意!
2. 分享目的仅供大家学习和交流,请不要用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布投稿,分享有金币奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务 请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长,可领回失去的金币,并额外有奖!
6. 如遇到加密压缩包,默认解压密码为"www.zyfx8.cn",如遇到无法解压的请联系管理员!
本站部分文章、资源来自互联网,版权归原作者及网站所有,如果侵犯了您的权利,请及时联系我站删除。免责声明
资源分享吧 » 冰河暗涌防不胜防 BIOS下实现的Telnet后门

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
织梦模板使用说明
你下载的织梦模板并不包括DedeCMS使用授权,根据DedeCMS授权协议,除个人非盈利站点外,均需购买DedeCMS商业使用授权。购买地址: http://www.desdev.cn/service-dedecms.html

发表评论

Copyright 2015-2020 版权所有 资源分享吧 Rights Reserved. 蜀ICP备14022927号-1
开通VIP 享更多特权,建议使用QQ登录