前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >高级静态分析技能基础:X86架构的堆栈结构描述

高级静态分析技能基础:X86架构的堆栈结构描述

作者头像
望月从良
发布2020-10-26 15:40:20
7410
发布2020-10-26 15:40:20
举报
文章被收录于专栏:Coding迪斯尼Coding迪斯尼

在代码运行时需要临时存放各种信息,例如函数调用时的输入参数,局部变量等,这些信息存储在一种叫做”栈“的数据结构上。它的特点是后进先出,也就是最后存储到栈里面的数据将会最先被取出来。X86体系自带栈结构,寄存器ESP,EBP专门用于对栈进行操作。EBP指向栈所在的内存地址,ES[图片上传中…(截屏2020-09-30 下午3.56.59.png-a3f002-1601452956326-0)] P指向数据进入或弹出堆栈所在的位置,同时对于栈操作的指令有push,pop,call,leave,enter,ret等。

栈内存的分配由高到低,也就是当数据压入堆栈时,会被最先存储在地址高的内存,如下图所示:

堆栈在程序安全中发挥着非常重要作用,很多系统被破解就是从堆栈入手。同时使用堆栈最多的是函数调用,函数在执行时,在二进制层次,代码的运行遵循所谓的cdecl原则。其过程为,在任何函数执行前都会有一段固定的“开场白”,它的作用就是对堆栈进行一些预处理,也就是准备好操作堆栈用的各个寄存器。在函数的结尾处同样有对应的“终场白”,其作用就是恢复堆栈信息和清空原来用于操作堆栈的寄存器。

我们看在二进制层面,函数执行时进行的一系列操作。首先是一系列push指令,它们将函数参数压入堆栈。接着,使用call指令后面跟着函数第一条指令在内存中的位置,call指令做好几个动作,首先是将call指令下一条指令的地址压入堆栈,因为函数调用完后需要返回当前位置继续往下运行,然后它将EIP寄存器的数值设置为函数第一条指令对应的内存地址,于是接下来就从被调函数第一条指令开始运行。

由于函数编译成二进制代码时,编译器会自动为其开头添加一段“开场白”,这段开场白会为函数的运行专门分配堆栈,这样函数就能存储它自己的局部变量,同时把EBP指针数值存入堆栈,这样函数结束后能快速将压入堆栈的信息弹出来。当函数的代码执行完后,编译器加在函数后面的“终场白”执行与开场白相反操作,它把开场白压入堆栈的信息弹出来,恢复原来存储在堆栈上相关寄存器的值,这时寄存器EBP的值会被恢复,此时EBP指向调用函数(注意不是被调函数)的堆栈,这样就可以访问调用函数的局部参数了,最后执行ret指令,该指令把执行被调函数前压入堆栈的EIP寄存器的值恢复,于是CPU就能回到函数被调用的位置,并接着执行下一条语句。

为了更加形象的理解上面描述,我们看下图:

上图表示函数调用时堆栈数据的变化。从0012F050到0012F040对应的数据是传递给被调函数的参数,注意到根据cdelc原则,最后一个调用参数先入栈,于是参数N先被压入一直到参数1,接着把EBP寄存器的值压入堆栈,也就是把函数调用前父函数的堆栈入口存储起来,然后将EBP的值指向当前ESP指针所在位置,当子函数运行时,对堆栈内存的访问就从0012F038开始,上图也可以看到子函数在堆栈上存储了N个自己的局部变量,每次要存储局部变量时,ESP的值都会减4,例如此时如果执行 push EAX寄存器的值压入堆栈,那么ESP就会指向0012F028,然后把EAX寄存器的信息存贮在给定位置的4字节。

接下来如果执行pop ebx,那么CPU就会将ESP所指向位置开始4字节的数据转移到寄存器ebx,然后将ESP的值加4,使得它指向0012F02C。X86指令提供了几条专门针对堆栈的操作指令,例如pusha,一条指令就能分别将寄存器AX,CX,DX,BX,SP,BP,SI,DI压入堆栈,指令pushad就能分别将寄存器:EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI压入堆栈,寄存器在将高级语言编译成机器指令时,很少使用这些操作指令,如果在反汇编中时常看到这些指令时,我们就有理由怀疑二进制代码被人动了手脚。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coding迪斯尼 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档