windows下的shellcode剖析浅谈
今天是中秋节,正好我的文章在今天基本完成,作为中秋礼物送给大家,由于本人水平有限希望大家多多批评指正!
学习了好些日子了,思路总是乱乱的,这几天决定养成个好习惯,把自己学习的一些东西做一些总结写篇文章,以便归纳和总结,并从中能够更深刻更系统化的理解其技术原理。 今天,就从shellcode来下手吧!
说到shellcode可能都有些迷茫,不知它是什么东西,可能觉得也很神秘,对于它的专业解释也很少有人提及,今天我们就从以下几个方面来对windows下的shellcode做一个全剖析:
1. shellcode的发展历史以及定义
2. 现今常见的windows下的shellcode种类
3. 动手编写一个简单的shellcode
4. shellcode的存在形式以及编码方式
5. exploit中的shellcode
好了,下面我们就逐一来弄清楚这些问题吧!
1. shellcode的发展历史以及定义:
对于shellcode的发展历史,failewest兄的《0day安全:软件漏洞分析技术》一书中讲的很明白,这里就引用一小段:
“1996年,Aleph One在Underground发表了著名论文《SMASHING THE STACK FOR FUN AND PROFIT》,其中详细描述了Linux系统中栈的结构和如何利用基于栈的缓冲区溢出。在这篇具有划时代意义的论文中,Aleph One演示了如何向进程中植入一段用于获得shell的代码,并在论文中称这段被植入进程的代码为’shellcode’。
后来人们干脆统一用shellcode这个专用术语来通称缓冲区溢出攻击中植入进程的代码。这段代码可以是出于恶作剧目的的弹出一个消息框,也可以是出于攻击目的的删改重要文件、窃取数据、上传木马病毒并运行,甚至是出于破坏目的的格式化硬盘等等。”
其实,现在shellcode的应用也很广泛,甚至有些远程控制软件也把自己能做成一个shellcode形式,我们只要理解这个是溢出之后干坏事的一段代码。(文章中提及的shellcode也全是跟溢出相关的shellcode)
2. 现今常见的windows下的shellcode种类
这里,我就直接从功能上来分类:
(1) 反弹端口类(shell)
这是一个真正的原始意义上的shellcode,不得不讲
(2) 下载并执行类(download&exec)
这个是最简单的一类shellcode,在网马中的应用也最广泛
(3) 生成并运行可执行文件类(bindfile)
为什么会有这么一类shellcode呢?试想想,制造漏洞的坏人如果把前面两类shellcode绑定到一个应用软件exploit里面就会出现一些意外情况:
a) 假如你的反弹行为被防火墙给拦截了怎么办?
b) 假如对方的防范意识比较高打开doc、pdf之类的文件的时候总是把网断了再打开怎么办?
哎~,早有坏人替我们想到了这些问题,他们把自己的exe也一并绑定到exploit中,shellcode的功能就是把exe释放出来,然后运行。(这个方法有点邪恶吧)
3. 动手编写一个简单的shellcode
好了,前面说了这么多废话,说一会也该练练了。
这里为了方便讲解,我就选择用win32汇编来写吧。(当然我对c更熟悉些)前面两类shellcode的例子很多,这里我就着重介绍下bindfile类shellcode的编写。
首先,让我们来理理思路,看图:

这个图是按shellcode的执行流程来画的,下面逐一来讲解。
其实shellcode就是一段自主的而且功能完善的代码,不过里面不能直接调用API函数,因为它不是运行在编译器环境下,没有include来声明函数,更没有应用程序的函数表,所以,shellcode得自己想办法找到自己调用的API函数的地址,然后强行调用了。
(1) 查找kernel32.dll基址:
shellcode里面用的API函数一般都是与用户界面无关的,因为它要干坏事,一般都是偷偷的,所以它一般用的都是kernel32.dll里面的函数。所以,我们必须先找到kernel32的基址才能进一步找到各API的地址具体地址。
关于获取api基址的方法很多,我这里就讲最简单的一种(这里面集合了众多高手的实践经验):
利用PEB查找kernel32基址:
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
