漏洞利用——ShellCode 我全心全意 等待着 你说我愿意

ShellCode这个概念在漏洞利用以及病毒分析的过程中被疯狂的提及,但是一直对于ShellCode的定义以及如何界定一段代码是不是ShellCode比较疑惑,自己查阅了相关资料之后,也算是有了自己的小见解:
ShellCode:
1、所谓ShellCode就是一段硬编码的数据
2、硬编码就是在编程之初就将数据设定好的一种方式
3、这段硬编码的数据执行之后具有具体功能
4、界定一个代码段是不是ShellCode,最重要的就是这段代码段出现的位置以及出现的时机。
5、任意一段代码段都有可能成为ShellCode

ShellCode的执行:
ShellCode一般和漏洞利用紧紧的联系在一起,可能会只有这样的疑问,即使Shell Code是一段代码段,那么Shell Code怎么执行呢?这个就要说到漏洞利用了,就拿最简单的缓冲区溢出来说,(前边也有相应的博客来介绍二进制漏洞),在发生溢出之后,程序的eip已经发生改变,而eip是下一条指令执行的地址,因此,我们可以利用缓冲区溢出的原理来控制eip,获取对于程序的控制权限,这个时候我们可以将eip设置为我们的ShellCode的地址,将eip指向ShellCode的地址之后,成功获取程序的控制权,之歌时候就可以利用Shell Code来执行我们想要的操作。

ShellCode的结构

当我们通过ShellCode获取到程序的控制权限之后就可以干自己想干的事情了(为所欲为),当然这是在漏洞利用之后取得的成就,在此之后,我们就要通过ShellCode来完成特定的功能,哪怕是你可以通过shellCode来计算1+1,但是我们当然不可能要执行这么开玩笑的指令。通常情况下,ShellCode的功能要么对应执行一个恶意的exe文件,或者其他的恶意文件亦或者是其他的后门,网络行为。
所以整体来说ShellCode的结构大概如下:
在这里插入图片描述

ShellCode的工作流程

在控制程序的eip之后,我们执行ShellCode,而这个ShellCode的主要功能,是执行恶意的程序或者实现某些恶意的功能,值得注意的是,shellcode是不能直接来调用系统的API函数来进行功能的完善的,那么想要解决这个问题就要采用其他方法,一般的ShellCode采用的方式就是通过动态获取各个API函数,然后再通过获得各个API函数的地址,进行调用各个API函数来完成功能的实现,而这种方式的主要突破口就在于LoadLibrary和GetProcAddress这两个API函数,通过这两个函数可以加载任意一个DLL同时也可以获得任意一个函数的地址,所以问题也就衍生为获取LoadLibrary函数和GetProcAddress函数的地址,而这两个API函数的地址我们是可以通过获取Kernel32.dll的基址,之后遍历导出表函数可以得到的。

ShellCode的工作流程的第一步就是:获取API函数的地址
获取API函数也分为以下几个流程:
1、获取Kernel32.dll的基址
2、遍历导出表
3、获取LoadLibrary和GetProcAddress两个API函数的地址
获取Kernel32.dll函数的基址一般有3种方法:
1、暴力搜索法
2、异常处理链表(SEH)搜索法
3、通过TEB来寻找
这里主要介绍通过TEB来进行寻找Kernel32.dll的基址(其实之前也有过相关的笔记来寻找Kernel32.dll)(之后会补一下关于另外两种方法找Kernel32.dll基址的实现)
下面以一张图来简要介绍寻找过程:
在这里插入图片描述
在这里插入图片描述
最后指向的struct_LDR_DATA_TABLE_ENTRY结构里边就存在着我们的目标DLL的基址,第一个指向的DLL的名称为Ntdll.dll,第二个指向的DLL就是Kernel32.dll,这样第一个问题,也就是Kernel32.dll的基址已经获取到,接下来就是第二个问题:
第二步:遍历导出表,获取GetProcAddress和LoadLibrary这两个API函数的地址
遍历导出表的过程就不再赘述
(其实在上边的过程中,不管是在获取API函数的过程亦或者是在获取Kernel32.dll的模块基址的时候,都会遇到一个问题,那就是判断我们获取到的地址是不是正确的,那么这里就涉及到一个问题:我们在进行判断的时候,是直接以名称的方式进行比较吗?但是如果采用这样的方式有一个问题不得不重视,如果要这样比较的话我们的ShellCode里边就必须将这些名字同时硬编码,这就会造成空间浪费的情况,那么怎么解决这个问题呢?最常见通用的方法就是直接将名称进行简单的加密运算之后再进行比较,可以是自己设计的加密算法也可以直接采用现成的加密算法)
第三步:执行恶意代码
一般ShellCode再执行恶意代码的时候,完成的功能无非就是一下几种:
1、加载执行一个恶意的文件
2、通过网络连接行为,下载一个恶意的文件来执行
3、木马行为、后门等等

有错误或者不足的地方欢迎大家指正

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值