数组越界

正常代码
void HelloWord()
{
	printf("hello word");
}


void Fun1()
{
	int arr[5] ={1,2,3,4,5};
}



int main(int argc, char* argv[])
{
	//+Function(10,11);
	Fun1();

	return 0;
}

代码正常运行,查看反汇编
0040DB90   push        ebp
0040DB91   mov         ebp,esp   提升栈顶
0040DB93   sub         esp,54h
0040DB96   push        ebx     保护现场
0040DB97   push        esi
0040DB98   push        edi
0040DB99   lea         edi,[ebp-54h]   填充数据
0040DB9C   mov         ecx,15h
0040DBA1   mov         eax,0CCCCCCCCh
0040DBA6   rep stos    dword ptr [edi]     
0040DBA8   mov         dword ptr [ebp-14h],1     赋值
0040DBAF   mov         dword ptr [ebp-10h],2
0040DBB6   mov         dword ptr [ebp-0Ch],3
0040DBBD   mov         dword ptr [ebp-8],4
0040DBC4   mov         dword ptr [ebp-4],5
0040DBCB   pop         edi
0040DBCC   pop         esi                   
0040DBCD   pop         ebx
0040DBCE   mov         esp,ebp
0040DBD0   pop         ebp        ebp+4 的值就是esi  函数返回值



当我们定义一个数组越界的时候
void Fun1()
{
	int arr[5] ={1,2,3,4,5};
	arr[6] = 0x12345678;
	//printf("%d\n",arr[6]);
}



int main(int argc, char* argv[])
{
	//+Function(10,11);
	Fun1();

	return 0;
}

arr[6] = 0x12345678;的反汇编为
0040DBCB   mov         dword ptr [ebp+4],12345678h  我们知道 ebp+4 的地址为函数返回值也就是esi



当程序pop ebp时,EIP为0x122345678,CPU会跳到这个地址,


把这个地址换为一个我们自定义的函数地址,代码如下:
void HelloWord()
{
	printf("hello word");
}


void Fun1()
{
	int arr[5] ={1,2,3,4,5};
	arr[6] = (int)HelloWord();
	//printf("%d\n",arr[6]);
}

查看反汇编

查看00401046 是一个jmp 跳转到helloword函数,

最后运行helloword,这应就是栈溢出的利用吧

上一篇
数组取值
下一篇
冒泡排序
发表评论 / Comment

提示:本文章评论功能已关闭