- 1、本文档共45页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
中国科大 6.2 全局存储分配策略 利用活动记录进行的“黑客”行为 ——缓冲区溢出攻击 缓冲区溢出攻击 缓冲区溢出攻击: 缓冲区溢出攻击 缓冲区溢出攻击: 缓冲区溢出攻击 void bar(void) {printf(我是bar()函数,程序的执行流程改变了!\n);} void main(int argc, char *argv[]) { printf(foo() 函数的地址是 %p \n,foo); printf(bar()函数的地址是%p \n,bar); foo(argv[1]); getch(); } 缓冲区溢出攻击 缓冲区溢出攻击 缓冲区溢出攻击 缓冲区溢出攻击 foo() 函数的地址是bar()函数的地址是0040100A cc cc cc cc cc cc cc cc cc cc cc cc 80 ff 12 00 58 12 40 00 ae 0e 43 00 f8 eb fd 7f c0 1f 1234567891234567 @ 6.3 非局部名字的访问 本节介绍 过程内部如何访问过程外部声明的名字? 静态作用域 无过程嵌套的静态作用域(C语言) 有过程嵌套的静态作用域(Pascal语言) 动态作用域(Lisp语言) 6.3 非局部名字的访问 6.3.1 无过程嵌套的静态作用域 过程体中的非局部引用可以直接使用静态确定的地址 局部变量在栈顶的活动记录中,可以通过base_sp指针来访问 无须深入栈中取数据,无须访问链 过程可以作为参数来传递,也可以作为结果来返回 6.3 非局部名字的访问 6.3.2 有过程嵌套的静态作用域 过程嵌套深度 sort 1 readarray 2 exchange 2 quicksort 2 partition 3 变量的嵌套深度:它的声明所在过程的嵌套深度作为该名字的嵌套深度 6.3 非局部名字的访问 寻找非局部名字存储单元的访问链 6.3 非局部名字的访问 1、假定过程p的嵌套深度为np,它引用嵌套深度为na的变量a,na ? np。如何访问a的存储单元? 从栈顶的活动记录开始,追踪访问链np ? na次。 到达a的声明所在过程的活动记录。 访问链的追踪用间接操作就可完成。 6.3 非局部名字的访问 访问非局部名字的存储单元 6.3 非局部名字的访问 过程p对变量a访问时,a的地址由下面的二元组表示: (np ? na,a在活动记录中的偏移) 6.3 非局部名字的访问 2、建立访问链 假定嵌套深度为np的过程p调用嵌套深度为nx的过程x np nx的情况 x肯定就声明在p中 被调用过程的访问链必须指向调用过程的活动记录的访问链 6.3 非局部名字的访问 2、建立访问链 6.3 非局部名字的访问 2、建立访问链 假定嵌套深度为np的过程p调用嵌套深度为nx的过程x np ? nx的情况 sort 1 readarray 2 exchange 2 quicksort 2 partition 3 6.3 非局部名字的访问 2、建立访问链 假定嵌套深度为np的过程p调用嵌套深度为nx的过程x np ? nx的情况 p和x的嵌套深度分别为1,2,…,nx? 1的外围过程肯定相同 追踪访问链np ? (nx – 1)次,到达了静态包围x和p的且离它们最近的那个过程的必威体育精装版活动记录 所到达的访问链就是x的活动记录中的访问链应该指向的那个访问链 6.3 非局部名字的访问 2、建立访问链 6.3 非局部名字的访问 6.3.3 动态作用域 被调用过程的非局部名字a和它在调用过程中引用的是同样的存储单元。 新的绑定仅为被调用过程的局部名字建立,这些名字在被调用过程的活动记录中占用存储单元。 6.3 非局部名字的访问 program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3) end; procedure small; var r: real; begin r := 0.125; show end; begin r := 0.25; show; small; writeln; show; small; writeln end. 6.3 非局部名字的访问 program dynamic(input, output); var r: real; procedure show; begin write(r: 5: 3)
文档评论(0)