1、1.缓冲区溢出攻击原理,堆栈,(已初始化数据) 数据段 (未初始化数据),代码段,一个进程的内存映像,文本段(代码段)文本区域是由程序确定的, 包括代码(指令)和只读数据。 该区域相当于可执行文件的文本段。 这个区域通常被标记为只读, 任何对其写入的操作都会导致段错误(segmentation violation,数据段数据区域包含了已初始化和未初始化的数据。 静态变量储存在这个区域中,堆栈用于函数调用,用于返回,高,低,1) 缓冲区溢出攻击(实例),main() char passwd8 = “2e4rfe“;char yourpasswd8 = “; again:puts(“please
2、input passwd?“);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)中的内容作为返回地址(RET);3) 第
3、三个放入堆栈的是基址寄存器(FP);4) 然后把当前的栈指针(SP)拷贝到FP,作为新的基地址;5) 最后为本地变量留出一定空间,函数调用与堆栈,缓冲区溢出攻击,缓,冲,区,寄存器,EIP,argc,argv,ESP,EIP,buf,ESP,低,高,进入函数后的堆栈,拷贝超长字符,数组到缓冲区中,释放局部变量,ESP指向返回地址,从堆栈中取出的,EIP,执行shell code,EIP,ESP,EIP,EIP,例子,int AFunc(int i,int j) int m = 3; int n = 4;m = i; n = j;BFunc(m,n);return 8; ,int BFunc(i
4、nt i,int j) int m = 1;int n = 2;m = i;n = j;return m; ,int main() AFunc(5,6); return 0;,6,AFunc(5,6); push 6 push 5 call _AFunc add esp+8,函数调用中栈的工作过程,5,EIP,_AFunc push ebp mov ebp,esp sub esp,48h /压入环境变量 /为局部变量分配空间,EBP,48h,EDI ESI EBX,3(m=3),4(n=4),6,AFunc(5,6); call _AFunc add esp+8,函数调用中栈的工作过程,5,E
5、IP,_AFunc return 0; pop edi pop esi pop ebx add esp,48h /栈校验 pop ebp ret,EBP,48h,EDI ESI EBX,3(m=3),4(n=4),当缓冲区溢出发生时,int AFunc(int i,int j) int m = 3; int n = 4;char szBuf8 = 0; strcpy(szBuf, “This is a overflow buffer!”);m = i;n = j;BFunc(m,n);return 8; ,#include #include void input() int access(0)
6、; /access为1时表示登录正确得到权限,初始为0char password4; /用于存储用户输入的登录密码 coutpassword; if(strcmp(password,“1988“)=0)/比较两个串是否相等,如果相等返回值为0 access=1; /两串相等,将权限变量赋值1 if(access!=0) /access非零,则登录成功 cout“登录成功“endl; else /access为零,登录失败 cout“error“; void main() input(); /函数调用 ,example.c void function(char *str) char buffer16; strcpy(buffer,str); void main() char large_string256; int i; for(i=0;i255;i+) large_stringi = A; function(large_string); ,*str,Ret (Function后的指令地址),基地址FP,buffer,栈底(内存高端),程序运行结果:buffer、FP、RET、甚至Str本身等的值都变成了A,攻击原理:改变RET的值;用特殊的可执行指令来改变这样就可以达到攻击目的。RET的位置是可以被计算出来的(偏移值),