看雪论坛
发新帖
6

[原创]纯字母shellcode揭秘

snowdbg 2010-5-17 10:40 11605
最近仙果兄弟有一篇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其中,我们能不能看穿实际上就是看学习者本身的研究深入程度了。
本篇文章没有多大技术含量只是说明一些小问题,各位达人见笑了~~
上传的附件:
本主题帖已收到 0 次赞赏,累计¥0.00
最新回复 (14)
lzdfkwdz 2010-5-17 11:22
2
应该是个音乐文件吧。。。。
15
achillis 2010-5-17 11:25
3
似乎是老外写过一个这样的引擎,灰常强大~~普通的shellcode经过编码都可以变成纯字母数字的,这个过程不难,关键是解码部分写成纯字母的需要很强的功力~~
ipfans 2010-5-17 11:29
4
http://skypher.com/wiki/index.php/Hacking/Shellcode/Alphanumeric/ALPHA2

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

只可惜,过于追求“NB”,导致了此类SHELLCODE某项指标太突出了,比较容易检测。
7
轩辕小聪 2010-5-18 07:00
14
http://bbs.pediy.com/showthread.php?t=113227
07年Realplayer漏洞的那个纯字符shellcode的调试,我详细搞了一遍,那个shellcode连解码引擎都是纯字母数字的,希望对进一步理解这方面的编写技巧有帮助。
jasonzhou 2010-5-18 10:39
15
这方法在js的加密里用的很多
方振箱包 2017-3-24 09:49
16
此楼层已删除
返回



©2000-2017 看雪学院 | Based on Xiuno BBS | 域名 加速乐 保护 | SSL证书 又拍云 提供 | 微信公众号:ikanxue
Time: 0.013, SQL: 10 / 京ICP备10040895号-17