能力值:
( LV9,RANK:490 )
2 楼
支持了再学习
能力值:
(RANK:110 )
3 楼
嗯,呵呵。大家共同探讨。
能力值:
( LV4,RANK:50 )
4 楼
NtCreateSection->MmCreateSection->MiRelocateImage的一个BUG,系统在重定位 镜像时会从重定位表COPY 0XC个字节到镜像基址(被映射到SYSTEM CACHE) + 重定位表VA的地址, 但没检查重定位表VA是否超出镜像大小,导致BSOD
能力值:
(RANK:110 )
5 楼
不大明白啊,这根字符串Unicode转换有什么关系么?
能力值:
( LV17,RANK:1820 )
6 楼
写得不错,支持一下!
文中c3前后构造的指令跟我的情况是一样的,但经unicode转换后明显不一样,不排除存在操作环境或设置的差异性。至于字符的转化跟字符所在字符串是否有关系,这个我也不太清楚,没有实验过。不过你文本中所使用的方法,也不失为一种寻找ret指令的好方法,值得借鉴,呵呵……
至于xzchina所说的问题,我也不太明白,希望可以解释一下。
能力值:
(RANK:110 )
7 楼
谢谢,呵呵。本来想提升一下层次,探讨一下Unicode在中文系统下的转换问题。可是水平有限。一直希望有对应用程序编写比较熟悉的牛人来指导一下。看看这个转换究竟是怎么回事。呵呵
能力值:
( LV2,RANK:10 )
8 楼
向楼主学些学习
能力值:
( LV2,RANK:10 )
9 楼
支持
来学习了。。
能力值:
(RANK:110 )
10 楼
我去,这么多Kx
能力值:
( LV6,RANK:90 )
11 楼
不好意思,我曾经研究和移植过iconv开源库,这是目前最流行最强大的开源字符转换库,你研究一下他的源代码就会明白你的猜测:“字符的转化还跟字符所在字符串有关系”,是什么原因了。简单来说,是由源字符串的编码格式决定的,在windows操作系统上源字符串的编码格式就是所谓的codepage.
codepage是虾米玩意呢?简单的说就是微软对各个国家的标准字符集的一种修改或叫山寨。比如简体中文版windows操作系统的默认字符集是cp936,所谓的cp936其实是对GBK的扩展,所谓的GBK又是对GB2312的扩展,搞计算机的估计对GB2312很熟悉,因为课本上讲字符集就讲得这个。可以用下面的命名查看当前的字符集:
D:\>chcp
Active code page: 936
能力值:
( LV6,RANK:90 )
12 楼
接上。。。。。
上面说到了字符集,那和字符编码是啥关系呢?比如“愛"这个字,在台湾,香港,大陆的windows操作系统上都可以打出来,但是保存成普通的.txt文档,再换到别的机器打开可能就是乱码的。计算机不识别任何字符,只识别编码,所谓编码就是字符在不同字符集中的编号而已。"爱"在big5,gb18030,HKSCS,utf-8等字符集中的编号不一样。
那么什么是宽字符呢?widechar?unicode?都语嫣不详啊。其实unicode有两层含义,第一丛是指的字符集,在ISO/IEC 10646标准中定义,就是"全球所有语言"(肯定有很多遗漏的)中出现的字符的集合。所以我们说unicode可以表示所有的字符。第二丛含义是utf-16,unicode中这么多的字符怎么表示呢?这就涉及到对这些字符的编码方案,有很多种,比如utf-7,utf-8,utf-16,utf-32,我们说的宽字符就是unicode字符集的utf-16编码方案,在该方案中,绝大部分字符被编码成两个字节,极少数字母被编码成4字节。
MultiByteToWideChar()这个系统函数是干啥的呢?其实就是实现两个编码系统的映射,如此而已,本质上没有什么神秘的。当然了实际操作过程中,要处理的特殊情况特别多而已。比如“愛”这个字在cp936中编号是90db, multibytetowidechar()后是1b61或者611b(由BOM决定)。“愛”在big5中编号是b752,使用multibytetowidechar()(参数要正确)后也是611b。。当然了这些转换肯定也不是查查表那么简单的,因为ucs-4在定义时时充分考虑了各个国家现行的字符集编码方案的。
上面罗嗦了一大通,没到点子上。。。。其实字符编码这事不简单,可以写成一本书。。。再涉及到字体,也就是字符的呈现上就更不简单了。。。
能力值:
( LV6,RANK:90 )
13 楼
现在说说为什么C3在有些系统上会被multibytetowidechar()翻译成c3 00(00 c3),而有的系统则不然。。。很明显是由于原字符编码不一样。
使用multibytetowidechar()方法若参数CodePage=0,就会使用当前编码页。。。
具体来说c3这个字符是?,
其在unicode中的编码是\u00c3,在gbk、ascii等中未定义,在iso8859-9中的编码是\xc3。。
>>> s=u'\u00c3'
>>> s.encode('gbk')
Traceback (most recent call last):
File "<pyshell#31>", line 1, in <module>
s.encode('gbk')
UnicodeEncodeError: 'gbk' codec can't encode character u'\xc3' in position 0: illegal multibyte sequence
>>> s.encode('ascii')
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
s.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc3' in position 0: ordinal not in range(128)
>>> s.encode('iso8859-9')
'\xc3'
对于楼主所举得例子“\x72\xcb\x72”,使用cp936解码之后为
>>> s='\x72\xcb\x72'
>>> s.decode('cp936')
u'r\u85c3'
不知道我说明白了没有。。。网络限制,打出来一大篇。。。。只能一段段贴上来。
能力值:
( LV6,RANK:90 )
14 楼
我觉得我应该另起一贴,叫【原创】对《编写unicode exploit》一文的补充之三 ,哈哈,说不定也能挣个精华什么的~~~~~
能力值:
(RANK:110 )
15 楼
[QUOTE=pearkiller;904949]我觉得我应该另起一贴,叫【原创】对《编写unicode exploit》一文的补充之
三 ,哈哈,说不定也能挣个精华什么的~~~~~[/QUOTE]
我觉得你这个想法很靠谱。
有两点不明白:
第一,编码转换大致是如何进行的,这个实验表明它肯定不是一对一的转换。那么,它是几个字节结合到一起去转换么?(其实就是明确回答一下我的猜想到底是什么缘故——“字符的转化还跟字符所在字符串有关系”)
第二,编码转换之后,字符的显示是不是也有一个转换的过程,希望提供资料,或者大致说一下原理。
你可以写一篇日志探讨挑战指令在Unicode Exploit里面的通用字符表示),如果你能找到这样一串二进制,无论通过什么样的本地codepage,转换后的二进制反汇编出ret、jmp或者其他的跳转指令。我觉得你功德无量,而且史无前例啊。
或者,你也可以探讨一下版本通用性的各种实用方法。期待中
能力值:
( LV17,RANK:1820 )
16 楼
[QUOTE=pearkiller;904949]我觉得我应该另起一贴,叫【原创】对《编写unicode exploit》一文的补充之三 ,哈哈,说不定也能挣个精华什么的~~~~~[/QUOTE]
占座学习,强烈建议你出补充之三
能力值:
( LV17,RANK:1820 )
17 楼
这个相当有难度,这么多种codepage类型,找到个通用指令的可能性相当低啊!
能力值:
(RANK:110 )
18 楼
所以我觉得如果能成功找出一个真是功德无量,史无前例。不亚于fuzz出一个0day的。
能力值:
( LV2,RANK:10 )
19 楼
菜鸟占楼学习一下 原文都还没学完 补充都出了好几篇了。。。
能力值:
( LV13,RANK:290 )
20 楼
每个漏洞都是特定的codepage,并且可以很简单的针对这种既定情况找出应对方案,我认为所谓通用指令没有太大意义。
能力值:
(RANK:110 )
21 楼
针对既定情况找出应对方案,问题是没有一个通用的或者标准的方法来实现。也许我在本文中通过字符串暴力搜索算是一种,但是不确定性太大。希望有真的大牛来讲一讲制式的方法,就如同写Unicode Shellcode本来是件很难的事,但是由于有Alpha 2编码,使得我们写Unicode shellcode轻松的多。