04_CC++漏洞_栈溢出利用.ppt
《04_CC++漏洞_栈溢出利用.ppt》由会员分享,可在线阅读,更多相关《04_CC++漏洞_栈溢出利用.ppt(50页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、CompanyLOGO安全性编程方法天津农学院计算机科学与信息工程系软件工程教研室许晓华v第4讲 v栈溢出利用4.1系统栈的工作原理v栈与系统栈的区别:v栈:数据结构角度的栈,是一种先进后出的数据表.常见操作PUSH进栈POP出栈栈的属性TOP栈顶BASE栈底v系统栈:内存的栈区透明性概念v对于C语言这样的高级语言,系统栈的PUSH,POP等堆栈平衡细节是透明的。v一般说来,只有在使用汇编语言开发程序的时候,才需要和它直接打交道。v计算机中透明性概念:计算机中存在,但对于开发人员不需要了解的东西.v高级语言写出的程序经过编译链接,最终会变成PE文件。当PE文件被装载运行后,就成了所谓的进程。v
2、如下图所示:系统栈与函数调用v#includestdafx.hvintfunc_B(intarg_B1,intarg_B2)vvintvar_B1,var_B2;vvar_B1=arg_B1+arg_B2;vvar_B2=arg_B1-arg_B2;vreturnvar_B1*var_B2;vvintfunc_A(intarg_A1,intarg_A2)vvintvar_A;vvar_A=func_B(arg_A1,arg_A2)+arg_A1;vreturnvar_A;vvintmain(intargc,char*argv,char*envp)vvintvar_main;vvar_main=
3、func_A(4,3);vprintf(var_mainis%dn,var_main);vreturnvar_main;v栈帧v当函数被调用时,系统栈会为这个函数开辟一个新的栈帧,并把它压入栈中。v当函数返回时,系统栈会弹出该函数所对应的栈帧。调用时栈中的操作v在main函数调用func_A的时候,首先在自己的栈帧中压入函数返回地址,然后为func_A创建新栈帧并压入系统栈v在func_A调用func_B的时候,同样先在自己的栈帧中压入函数返回地址,然后为func_B创建新栈帧并压入系统栈v在func_B返回时,func_B的栈帧被弹出系统栈,func_A栈帧中的返回地址被“露”在栈顶,此时处
4、理器按照这个返回地址重新跳到func_A代码区中执行v在func_A返回时,func_A的栈帧被弹出系统栈,main函数栈帧中的返回地址被“露”在栈顶,此时处理器按照这个返回地址跳到main函数代码区中执行寄存器与函数栈帧vWIN32系统提供两个特殊的寄存器用于标识位于系统栈栈顶的栈帧:ESP:(extendedstackpointer)栈指针寄存器,指向系统栈最上面一个栈帧的栈顶EBP:(extendedbasepointer)基址指针寄存器,指向系统栈最上面一个栈帧的底部v函数栈帧:ESP和EBP之间的内存空间为当前栈帧。v另一个重要的寄存器EIP:(extendedinstruction
5、pointer)指令寄存器,指向下一条待执行的指令地址函数调用约定与相关指令vVisualC+默认的参数入栈顺序是:v右-左函数调用的步骤v参数入栈:将参数从右向左依次压入系统栈中v返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行v代码区跳转:处理器从当前代码区跳转到被调用函数的入口处v栈帧调整:具体包括:保存当前栈帧状态值,以备后面恢复本栈帧时使用(EBP入栈)将当前栈帧切换到新栈帧(将ESP值装入EBP,更新栈帧底部)给新栈帧分配空间(把ESP减去所需空间的大小,抬高栈顶)函数调用时的指令序列v;调用前vpush参数3/假设函数有3个参数,将从右向左依次入栈
6、vpush参数2vpush参数1vcall函数地址/call指令将同时完成两项工作:a)向栈中压入当前指令在内存中的位置,即保存返回地址;b)跳转到所调用函数的入口地址函数入口处vpushebp;保存旧栈帧的底部vmovebp,esp;设置新栈帧的底部(栈帧切换)vsubesp,xxx;设置新栈帧的顶部(抬高栈顶,为新栈帧开辟空间)例题v#includestdafx.hvvoidfun(inta,intb)vvintc=a+b;vvvoidmain()vvfun(1,2);v反汇编vVC+里如何反汇编?1.先在程序中设置断点(F9)2.调试(F5)3.用以下三种方法进入反汇编右键gotodis
7、assemblyAlt+8Windows菜单下选择“disassembly”函数返回的步骤v保存返回值:通常将函数的返回值保存在寄存器EAX中v弹出当前栈帧,恢复上一个栈帧,具体包括:在堆栈平衡的基础上,给ESP加上栈帧的大小,降低栈顶,回收当前栈帧的空间将当前栈帧底部保存的前栈帧EBP值弹入EBP寄存器,恢复出上一个栈帧将函数返回地址弹给EIP寄存器v跳转:按照函数返回地址跳回母函数中继续执行函数返回时的指令序列vaddxxx,esp/降低栈顶,回收当前的栈帧vpopebp/将上一个栈帧底部位置恢复到ebp,vretn/这条指令有两个功能:a)弹出当前栈顶元素,即弹出栈帧中的返回地址。至此,
8、栈帧恢复工作完成。b)让处理器跳转到弹出的返回地址,恢复调用前的代码区4.2修改邻接变量#includestdafx.h#includestring.h#includestdio.h#definePASSWORD1234567intverify_password(char*password)intauthenticated;charbuffer8;authenticated=strcmp(password,PASSWORD);strcpy(buffer,password);/在此在此处溢出溢出!returnauthenticated;main()intvalid_flag=0;charpass
9、word1024;while(1)printf(请输入密入密码:);scanf(%s,password);valid_flag=verify_password(password);if(valid_flag)printf(密密码不正确不正确!nn);elseprintf(密密码验证通通过n);break;v运行,密码输入qqqqqqq(7个q),不通过v输入qqqqqqqq(8个q),居然通过了密码验证v为什么?v先来了解一下大端机与小端机的概念。大端机与小端机v大端机(bigendian)低地址存放最高有效位(MSB:MostSignificantBit)例如:JavaVirtualMach
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 04 _CC 漏洞 溢出 利用
限制150内