“栈”里那点事儿

0x00 寄语

无论做什么,记得当初自己的想法和目的;唯不忘初心,方可得始终。

0x01 说点闲话

中国从古至今,很多词汇都是后面的字为该词汇的意义,比如“刀剑”,实际指“剑”;再比如“奶牛”,其实是“牛”;那么“堆栈”也同理,在很多教科书实际上指的是“栈”。栈结构有点类似枪械中的弹匣,填装弹药时,需要将子弹一个个压入其中,当扣动扳机时,后压入的子弹会先被击发出去;同理,向栈结构中插入数据时,栈顶会向“0地址”方向移动。

0x02 “栈”里面到底有啥

以VC++6.0编译链接的x86程序为例,0x0019FXXX为Win10系统中的栈空间地址(Win7的特征为0x0018FXXX、WinXp为0x0012XXXX);在VS系列的IDE中,将“随机基址”关闭,也可以观察到上述情况。

写个简单的程序,编译Debug版并运行,使用在VC++6.0自带的内存窗口中定位0x19FXXX附近,可以观察到类似下图的栈结构,其中包括了调用函数时传递的参数、返回代码的地址、调用方的栈底、局部变量的栈空间以及寄存器环境;每个函数在被调用时,都会产生一个这样的结构;另外,Debug版本程序在局部变量空间中写入大量的0xCC,目的是为了观察便利以及避免开发时出现的一些小错误而精心设计。通过观察,可以发现有三个0xCC区域,由于main函数有三个参数(int argc, char **argv, char **envp),可以得出第一个区域(最下面那个)所在结构为main函数被调用时所产生,上面有两个0xCC区域,又因为当函数执行完毕时会将申请的栈空间释放掉(0xCC会变成别的),进而可以推导出目前main函数中实现了嵌套调用了,并且有两次嵌套。

0x03 栈结构在函数调用时都干了啥

  1. 函数调用过程
    1. 按照调用约定传参;
    2. 保存caller的code地址;
    3. 保存caller的base;
      1. 由于top会随着数据的变化而变化,所以访问栈内数据时,以base为基准会更稳定一些。
    4. 更新base的位置到callee的base位置;
    5. 在callee的栈内为局部变量预留足够的空间;
    6. 将即将修改的CPU原值保存在callee的栈内;
    7. (*可选项)/Od(禁用优化)+/Zi(生成调试支持)的编译选项(Debug选项组),局部变量初值设定为0xCC
    8. 执行函数体;
    9. 恢复修改的CPU原值;
    10. 释放局部变量的空间;
    11. 恢复caller栈底;
    12. 清理参数空间;
      1. 用__cdecl时,以callee的栈顶作为返回的地址,接着由caller负责清理参数空间;
      2. 用其他约定时,以callee的栈顶作为返回的地址,接着由callee负责清理参数空间;
  • 备注
    • caller为调用方;
    • callee为被调方;
    • base为栈底;
    • top为栈顶;
    • code为代码;
    • 调用约定详见附录。

俗话说“左花一单步,执行上七步”,这里的“左花”,指的是main函数的左花括号,从调用函数开始到左花处单步一次后,会执行函数调用过程的前面七步,即是main函数在未执行函数体前的操作。

后面的步骤即是执行函数体部分以及执行结束后,栈空间的情况。

0xFF 附录

  • 调用约定:
    • 调用方(caller)和被调方(callee)需要约定:传参顺序参数存储媒介返回值存储媒介和位置以及有且仅有一方完成参数出栈(清理参数空间的操作)
    • __cdecl:
      • 传参顺序从右往左
      • 使用栈空间保存参数
      • 一般返回值在CPU
      • 由caller清空参数空间
    • __stdcall:
      • 传参顺序从右往左
      • 使用栈空间保存参数
      • 一般返回值在CPU
      • 由callee清空参数空间
    • __fastcall:
      • 传参顺序从右往左
      • 从左向右两个使用栈空间保存参数其他使用栈空间保存
      • 一般返回值在CPU
      • 由callee清空参数空间
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇