欢迎光临
箫启灵个人站点

【C语言,反汇编】 数组、字节对其的认识(内存溢出实例)

变量字节对其

char x;

short y;

int z;

字节对齐:

 一个变量占用 n 个字节,则该变量的起始地址必须是 n 的整数倍,即: 存放起始地址 % n = 0。

 如果是结构体,那么结构体的起始地址是其最宽数据类型成员的整数倍。

变量的地址,肯定是能被变量的宽度整除的。

结构体字节对其规则

1、结构体首地址,一定是其成员中,数据宽度最大的整数倍

2、结构体成员,遵循第一条规则     

3、最终结构体占用的空间,为最宽成员的整数倍   

4、同样变量的成员放一起,是最节省空间的

堆栈中,结构体,强制性是4的整数倍

原因有二

其一,堆栈指令就是4字节存放的

其二,堆栈是临时空间,不会永久保存数据,但是访问次数却远高于其他内存,所以相对而言,对堆栈的使用,更在意时间效率的提升

例如

char 原本是1个字节,但是系统分配的时候是按照4字节来分的。

clipboard.png


数组存储方式:

在数组里面,长度是实际类型宽度来的,char类型原本是1字节,长度应该是10。 由于本机宽度的原因,系统牺牲空间复杂度来弥补时间复杂度,所以自动拓展的时候,拓展成4的倍数,12个字节


clipboard.png


1111.png


2222.png



内存溢出跳其他方法


void Fun(){

    while(1)

    {

            printf("内存溢出。。。 \n");

    }

}

int check(){

    int arr[8];

    arr[9] = (int)&Fun;

    return 0;

}

void main()                //入口程序 程序开始执行的地方

{

    check();

    getchar();

    return;                //执行结束

}


clipboard.png

如图所示,数组arr下标是 0-7  当下标标记为8的时候,其地址为ebp,下标为9的时候,就是ebp+4,ebp+4应该是call的下一行汇编地址,这里把ebp+4的值改成了Fun函数地址,所以,直接跳到Fun函数中去了。

未经允许不得转载:箫启灵博客 » 【C语言,反汇编】 数组、字节对其的认识(内存溢出实例)

分享到:更多 ()

相关推荐

  • 暂无文章

刺蝴蝶De箫启灵

作死购站点VIP视频站站点