1、1.缓冲区溢出攻击原理堆栈(已初始化数据)数据段(未初始化数据)代码段一个进程的内存映像文本段(代码段)文本区域是由程序确定的 , 包括代码 (指令 )和只读数据。 该区域相当于可执行文件的文本段。 这个区域通常被标记为只读 , 任何对其写入的操作都会导致段错误(segmentation violation数据段数据区域包含了已初始化和未初始化的数据。 静态变量储存在这个区域中 堆栈用于函数调用,用于返回高低1) 缓冲区溢出攻击 (实例 )main()char passwd8 = “2e4rfe“;char yourpasswd8 = “;again:puts(“please input pa
2、sswd?“);gets(yourpasswd); if (strcmp(yourpasswd, passwd)= =0)goto ok;puts(“passwd error“);goto again;exit(-2);ok:puts(“correct!“);/ do work you wantreturn 0;程序的设计功能:输入正确的口令后做某项工作 (否则重复要求输入口令)演示:输入精心计划好的字串打乱设计期望的执行逻辑,从而绕过某些口令2)栈溢出攻击 (函数调用 )实在参数返回地址基地址栈底 (内存高端 )栈增长方向局部变量1) 首先把参数压入栈;2) 然后保存命令寄存器( IP) 中
3、的内容作为返回地址( RET);3) 第三个放入堆栈的是基址寄存器( FP);4) 然后把当前的栈指针( SP) 拷贝到 FP, 作为新的基地址;5) 最后为本地变量留出一定空间函数调用与堆栈 缓冲区溢出攻击 缓冲区寄存器EIPargcargvESPEIP bufESP低高 进入函数后的堆栈 拷贝超长字符数组到缓冲区中 释放局部变量ESP指向返回地址 从堆栈中取出的EIP,执行 shell codeEIPESPEIPEIP例子int AFunc(int i,int j)int m = 3;int n = 4;m = i;n = j;BFunc(m,n);return 8;int BFunc(int i,int j)int m = 1;int n = 2;m = i;n = j;return m;int main()AFunc(5,6); return 0;