首页
社区
课程
招聘
[原创]纯字母shellcode揭秘
发表于: 2010-5-17 10:40 19133

[原创]纯字母shellcode揭秘

2010-5-17 10:40
19133
最近仙果兄弟有一篇exploit分析的文章,里面提及了“纯字母shellcode”这个概念,回头翻翻以前调试过的一个exploit,里面就是用的这种shellcode编码技术,现在把它提出来跟大家交流交流。
   现在很多exploit的中使用的shellcode看起来貌似离我们常见的常规汇编的机器码大相径庭,好像只是一段来来回回的有效字符串(如字母,数字等等),而且单单对这段字符串进行反汇编看到的东西往往让我们匪夷所思,这里我们就来看看这样的shellcode是怎么回事。
首先举个例子:
前几天抓到的一个exploit样本里面,shellcode的主体是这样的一段:

这个看起来只是一段来来回回略有规律的字符串,但是从整个exploit来看这里确实是一段shellcode而且代码中是以shellcode为变量名来命名的,我们对它进行静态反汇编看看有没有什么发现:

我们应该会觉得这个如果是shellcode的话,那也太神奇了吧!
难道是反汇编器欺骗了我们?
呵呵,其实应该是我们没有深入的理解吧,或许是忽略了exploit里面一些重要的东西?唯一的解释就是----我们看到的shellcode是被进行了特殊处理的shellcode。
这个如果是shellcode主体的话,那只能说明在exploit中还是有另外一小段代码是对这段shellcode进行解码的。
再对exploit进行动态分析,我们察觉溢出之后跳到的一段代码并不是我们现在看到的纯字母shellcode,而是下面这一段:

呵呵,多了前面的33个字符:

真相就在这里:

看来确实是对下面的一段“纯字母shellcode”进行解码的。
对应的编码代码,我们将它翻译成C代码如下:
for (int i = 0;i < codeLen; i++)
	{
		low_al = ((byte *)decodescEnd)[i] & 0x0f;
		hi_ah = (((byte *)decodescEnd)[i] & 0xf0) >> 4;
		if (low_al > 0x8)
		{
			newscBuff[decodeLen+2*i + 1] = 0x40 + low_al;
		}
		else
		{
			newscBuff[decodeLen+2*i + 1] = 0x60 + low_al;
		}
		if (hi_ah > 0x8)
		{
			newscBuff[decodeLen+2*i] = 0x60 + hi_ah;
		} 
		else
		{
			newscBuff[decodeLen+2*i] = 0x40 + hi_ah;
		}
	}

从这个代码我们可以对其进行解码后如下:

反汇编如下:

这下似曾相识了吧!对了,这就是shellcode的本来面貌。
下面我们来总结下:
其实所谓的纯字母shellcode只不过是对真正shellcode 的一种巧妙的编码方式而已,从思路上讲,效果无异于异或之类的编码方式。作为一个exploit学习者来讲,真相往往就是置身在exploit其中,我们能不能看穿实际上就是看学习者本身的研究深入程度了。
本篇文章没有多大技术含量只是说明一些小问题,各位达人见笑了~~

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
应该是个音乐文件吧。。。。
2010-5-17 11:22
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
似乎是老外写过一个这样的引擎,灰常强大~~普通的shellcode经过编码都可以变成纯字母数字的,这个过程不难,关键是解码部分写成纯字母的需要很强的功力~~
2010-5-17 11:25
0
雪    币: 24
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
http://skypher.com/wiki/index.php/Hacking/Shellcode/Alphanumeric/ALPHA2

应用还算满广的,国内还有一个国人的优化版本,找了找不知道放哪了
2010-5-17 11:29
0
雪    币: 3171
活跃值: (76)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
5
嗯的确是这样的,不过现在的杀软 杀shellcode的少了,而且实际编写shellcode的时候也可以调用一些脚本语言本身的函数来实现编码。
2010-5-17 11:54
0
雪    币: 245
活跃值: (93)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
这样主要是为了避开\0截断吧.........
2010-5-17 12:56
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
7
如果只是避开\0的话,完全不用这么麻烦~~
主要是某些情况下对shellcode确实有特殊要求,比如文件路径超长引起的溢出,在构造shellcode时就必须考虑shellcode中的字符是不是符合文件路径中允许的那些字符,这时候就需要纯字母数字的shellcode了~~
还有些情况更复杂,防\0截断已经是最最简单的了。。。
2010-5-17 13:11
0
雪    币: 284
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这个有意思,学习了
2010-5-17 15:01
0
雪    币: 1491
活跃值: (975)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
9
黑防 在07年的一份杂志上面有介绍 纯字母数字的shellcode是如何实现的
应用方面当然是过杀软或者规避特殊字符
2010-5-17 17:04
0
雪    币: 124
活跃值: (38)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
en  学习了 不错的一篇文章
2010-5-17 17:11
0
雪    币: 3171
活跃值: (76)
能力值: (RANK:250 )
在线值:
发帖
回帖
粉丝
11
刚刚翻了翻,终于找到那篇文章了,还好,我理解的和那篇文章中的方法本质上是相同的,那篇文章中的编码方式就是“base16”。。。。
这种方式在JavaScript中编码shellcode很有用~
2010-5-17 23:40
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
12
一般就是用alpha2,这样加密后的shellcode内容(前面是解密代码,后面是加密数据)就只包含纯字母数字,至于原因,7楼已经说了,就是有一些漏洞如ActiveX插件的函数输入文件名超长引起的缓冲区溢出,有时需要作为输入参数内容一部分的shellcode中的字符符合文件名路径的要求,如07年时的Realplayer漏洞,是其插件的Import函数的缓冲区溢出,shellcode是作为输入的文件名路径的一部分加入其中,并利用覆盖SEH地址进行触发,在这种情况下就必须采用alpha2加密。
2010-5-18 01:05
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
只不过就是baseN的转换而已,看标题还以为是什么UFO

只可惜,过于追求“NB”,导致了此类SHELLCODE某项指标太突出了,比较容易检测。
2010-5-18 03:32
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
14
http://bbs.pediy.com/showthread.php?t=113227
07年Realplayer漏洞的那个纯字符shellcode的调试,我详细搞了一遍,那个shellcode连解码引擎都是纯字母数字的,希望对进一步理解这方面的编写技巧有帮助。
2010-5-18 07:00
0
雪    币: 213
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
这方法在js的加密里用的很多
2010-5-18 10:39
0
游客
登录 | 注册 方可回帖
返回
//