watercloud@xfocusorg(编辑修改稿)内容摘要:
部 变 量 区. . . . . .c a l l e r 的 栈 区 间c a l l e e 的 栈 区 间这儿主要介绍函数的参数传递和栈帧标识区 函数栈的参数存放区和栈帧标识区 函数栈的参数存放区和栈帧标识区 c a l l e r ( ){ c a l l e e ( )。 }栈 帧 标 识 区c a l l e r 的 栈 顶低 地 址高 地 址栈 增 长方 向进 入 c a l l e e 后 的 栈 分 布 情 况c a l l e e 的 栈 顶栈 帧 标 识 区参 数 存 放 区局 部 变 量 区对 齐 数 据寄 存 器 保 存 区参 数 存 放 区S P局 部 变 量 区. . . . . .c a l l e r 的 栈 区 间c a l l e e 的 栈 区 间这儿主要介绍函数的参数传递和栈帧标识区 . . . . . .A R G 4A R G 3A R G 2A R G 1A R G 0扩 展 D a t a / L T P o i n t e r扩 展 S R 4 / L P P o i n t e r扩 展 R P当 前 R PS t a t i c L i n kC l e a n U PR e l o c a t i o n S t u b R PP r e v i o u s S PS t a c k P o i n t e r参 数 存 放 区栈 帧 标 识 区低 地 址高 地 址S P 8S P 2 0S P 2 4S P 3 6 函数参数 函数栈的参数 . . . . . .A R G 4A R G 3A R G 2A R G 1A R G 0扩 展 D a t a / L T P o i n t e r扩 展 S R 4 / L P P o i n t e r扩 展 R P当 前 R PS t a t i c L i n kC l e a n U PR e l o c a t i o n S t u b R PP r e v i o u s S PS t a c k P o i n t e r参 数 存 放 区栈 帧 标 识 区低 地 址高 地 址S P 8S P 2 0S P 2 4S P 3 61. 调用函数时如果参数小于或等于 4个则通过 寄存器传递,如果大于 4个就需要用调用函数的栈来传递了。 但无论参数多少调用函数都始终在自己的栈中保留 4个32位地址用于存放 arg0arg3。 2. 当小于 4个参数时 caller通过寄存器将参数传递给 callee,而通常 collee会在开始处将寄存器 %r2 %r2 %r2 %r23存放到父函数 caller的参数存放区。 以后对参数的引用在通过父函数的参数存放区来读取。 3. 当参数个数大于 4个时, caller的栈参数存放区被分配了相应的空间,在调用callee前 caller将多出的参数存放到参数存放区相应的地方,将头 4个参数放入寄存器中。 进入 callee后 callee同样首先将 4个参数寄存器存入父函数 caller的参数存放区,并且以后通过这里引用参数。 4. 出现格式化字符串漏洞时对参数的引用将向低地址引用参数,向上将能够访问到函数的局部变量、再向上能够访问到程序的命令行参数和环境变量。 栈帧标识区 . . . . . .A R G 4A R G 3A R G 2A R G 1A R G 0扩 展 D a t a / L T P o i n t e r扩 展 S R 4 / L P P o i n t e r扩 展 R P当 前 R PS t a t i c L i n kC l e a n U PR e l o c a t i o n S t u b R PP r e v i o u s S PS t a c k P o i n t e r参 数 存 放 区栈 帧 标 识 区低 地 址高 地 址S P 8S P 2 0S P 2 4S P 3 6栈标识区中值得考察的有 : •SP20 : 非叶子节点函数的返回地址。 •SP24 : 当调用动态连接库时使用该地址来存放返回地址。 •SP8 : 当调用动态连接库时由动态连接库内部函数调用进入重定位节时使用 ,对它还有待研究,目前对他了解的不多。 栈溢出 在下面这种情况下我们就应该覆盖 SP20 处,并且可以大面积的覆盖。 void caller() { char buff[32]。 callee(buff,”用户输入字符串 ” )。 } void callee(char * dstr,const char * sstr) { strcpy(dstr,sstr)。 } 调用动态链接库函数 调用动态链接库函数 当调用动态链接库函数如 getenv()等时整个过程比调用本地的函数负责很多,先后有: 1. 而是首先转到了称为 Import Stub的一段代码处(使用到的每个外部函数对应一份),此处主要完成以下操作: • 从 PTL中加载目标地址。 • 从 PTL中加载目标模块的链接表指针到 %r19。 • 将返回地址写入 SP24处。 2. 转入目标函数的称为 Export Stub的一段代码处(动态链接库的每个函数对应一份),此处将进行如下操作: • 分支到真正的目标函数执行,并将 SP20处的返回地址填为自己内部的地址。 • 从目标函数返回后从 SP24处取出真正的返回地址。 • 跳转回到 caller。 c a l l e rI m p o r t S t u bE x p o r t S t u bc a l l e e代 码 空 间 程 序 代 码 区系 统 空 间 动 态 链 接 库 区( 1 )( 2 )( 3 )( 4 )( 5 ) 堆空间分配 堆空间分配 ? 1. 程序刚开始运行时会分配一个堆空间。 并且如果该空间用完后再次要 求分配空间时会按 4k为单位分配一个新的空间。 2. 在以 4k为单位的子空间内由某种数据结构算法对子空间进行管理。 3. 每次 malloc(n)会以 4字节为单位分配一段地址。 • 但分配的真正大小为 (n1)/4 *4 +4 + 8 • (n1)/4 * 4 + 4 为以 4自己对其分配的大小 ,附加的 8个为堆管理内部使用的信息。 • 其中前 4字节存放了一个地址,后 4字节似乎存放了该内存块中空闲空间大小。 4. 目前发现如果将附加的后 4个表示大小的值改为较大的地址那么在 free时会产生对无效页面的访问而造成程序被中止并产生一个 core文件。 目前对堆空间分配还没有研究多少,并不知道堆溢出是否可以利用。 但已知一些信息如下: 系统调用 系。watercloud@xfocusorg(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。