简介
当我们使用MSF生成payload的时候,会生成如下图这样的形式:
这个16进制的数据其实由三个方面组成:
block_api.asm
,block_reverse_tcp
,block_recv
。
源码可以附在github上这里看:
接下来我们依次进行分析
block_api
我们都知道Shellcode是可以直接放在内存里面就相当于执行了,但是一般的应用程序放在内存里需要IAT(导入表)这个东西,所以Shellcode也需要这么一个部分用来找寻API函数,使他可以在内存里面执行。
首先Rdx这里是一个TEB结构体。而Rdx+x60又是一个结构体,叫做PEB。
在PEB这个字典里面又有一个叫做LDR的东西,它是一个信息结构。
我们使用LDR主要是去找kernel32.dll
里面的函数。(这种加载函数的方式是没有导入表的情况下,手动去寻找API的方式)。
后面一大段都是为了找寻里面的函数和函数地址,相当于是作者自己写了个方法找函数。
block_reverse_tcp
接下来第二段是想要去建立一个连接,首先去找到windows的一个lib库:ws2_32
。这个东西在自己电脑里面也可以搜索到:
如果你想用这个东西,你需要一个叫做WSadata
的结构体,并且在后面需要一个叫做WSAStartup
的函数,这个是c语言写socket的方法。
接下来这一点是为了将地址和端口写入进去:
然后通过小段序的方式可以看出对应的端口和ip地址。所以以后其实分析MSFshellcdoe的时候,可以注意看这一个地方。(最后的2000
表示的是家族序列AF_INET)
接下来就是创建一个socket对象,并且进行连接,就像python里面的socket.socket
block_recv
连接成功之后,MSF服务端会向客户端传回来一个二进制文件Meterpreter(相当于加强版的powershell)。
所以shellcode首先会采用接受方法Recv,用于接受传过来的数据。
之后会用virtualloc函数来创建内存空间。
将recv的东西挨个挨个加进去
有空间有内容,最后只需要执行就可以了,于是最后收尾进行一个jmp跳转:
这样就成功完成加载了Shellcode。