百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

超级技术:微软官方编译器对于栈的检查

liebian365 2024-11-27 17:08 20 浏览 0 评论

前言

对于的栈的检查,一般都是有编译器来做。也就是说,当某个数据的分配越过规定的范围,就会报异常,那么这个过程是怎么样的呢?本篇来看下

概括

1.代码示例

#include<stdio.h>#include<Windows.h>void testFunc(char* Buf){ char testBuf[8]; memcpy(testBuf, Buf, 30); return;}int main(int argc, char** argv){ char Buf[64] = { 0 }; memset(Buf, 0x41, 64); testFunc(Buf); getchar(); return 0;}

这里面函数testFunc的testBuf只分配了8个字符串长度,但是memcpy往里面赋值了30个长度字符,所以导致了数组溢出,进而导致栈溢出。

memcpy处下断点x64下的汇编

00007FF6370117D9 41 B8 1E 00 00 00 mov r8d,1Eh //1Ehmemcpy的第三个参数00007FF6370117DF 48 8B 95 00 01 00 00 mov rdx,qword ptr [Buf] //第二个参数 00007FF6370117E6 48 8D 4D 08 lea rcx,[testBuf] //第一个参数 00007FF6370117EA E8 BF F9 FF FF call memcpy (07FF6370111AEh) //调用00007FF6370117EF 48 8D 4D E0 lea rcx,[rbp-20h] //rcx等于进入testFun函数的rsp值00007FF6370117F3 48 8D 15 06 84 00 00 lea rdx,[__xt_z+160h (07FF637019C00h)] //rdx包含了需要被检查数组testBuf信息00007FF6370117FA E8 03 FB FF FF call _RTC_CheckStackVars (07FF637011302h)//调用栈检查函数

这里其实很清晰,主要是rdx包含的被检查数组testBuf的信息。设若rdx地址如下,则内存信息:

0x00007FF637019C00 0000000000000001 00007ff637019bc0

表示1个数组,00007ff637019bc0进一步表示数组的信息

0x00007FF637019BC0 0000000800000028 00007ff637019bb0

这里的00000008表示testBuf数组的字节数,因为是char类型,所以占用8个字节。00000028则表示testBuf起始地址距离rbp的偏移量。00007ff637019bb0表示数组名称,如下所示:

0x00007FF637019BB0 0066754274736574 testBuf.

了解了以上,来看下核心代码:

2.核心

提示:向左边拖动有注释

00007FF637011997 39 1A cmp dword ptr [rdx],ebx //第一个判断,它这个地方判断rdx也即是数组是否为空,00007FF637011999 7E 56 jle _RTC_CheckStackVars+71h (07FF6370119F1h) //若是为空,直接返回00007FF63701199B 48 89 7C 24 30 mov qword ptr [rsp+30h],rdi 00007FF6370119A0 8B FB mov edi,ebx 00007FF6370119A2 0F 1F 40 00 nop dword ptr [rax] 00007FF6370119A6 66 66 0F 1F 84 00 00 00 00 00 nop word ptr [rax+rax] 00007FF6370119B0 48 8B 56 08 mov rdx,qword ptr [rsi+8] 00007FF6370119B4 48 63 0C 3A movsxd rcx,dword ptr [rdx+rdi] 00007FF6370119B8 81 7C 29 FC CC CC CC CC cmp dword ptr [rcx+rbp-4],0CCCCCCCCh //这里第二个判断,它判断的是数组testBuf的地址前面四个字节是否是0CCCCCCCCh,这里主要判断数组是否正常rbp是rsp的地址,rcx是数组字节长度加上距离rbp偏移量。减4,即时testBuf数组地址前四个字节。00007FF6370119C0 75 11 jne _RTC_CheckStackVars+53h (07FF6370119D3h) 00007FF6370119C2 48 63 44 3A 04 movsxd rax,dword ptr [rdx+rdi+4] 00007FF6370119C7 48 03 C1 add rax,rcx 00007FF6370119CA 81 3C 28 CC CC CC CC cmp dword ptr [rax+rbp],0CCCCCCCCh //第三个判断,这里相对于第二个判断rax里面多了数组字节长度,加上数组字节长度到了数组的结尾,然后判断数组结尾是否0CCCCCCCCh。这里明显不是,因为超出了,所以下面调用_RTC_StackFailure函数,报异常,表示当前函数出了异常。00007FF6370119D1 74 0F je _RTC_CheckStackVars+62h (07FF6370119E2h) 00007FF6370119D3 48 8B 4C 24 28 mov rcx,qword ptr [rsp+28h] 00007FF6370119D8 48 8B 54 3A 08 mov rdx,qword ptr [rdx+rdi+8] 00007FF6370119DD E8 71 F8 FF FF call _RTC_StackFailure (07FF637011253h)

以上三个判断,第一个判断是数组是否存在,第二个判断数组地址前四个字节是否是0CCCCCCCCh,第三个判断判断数组末尾的四个字节是否是0CCCCCCCCh。这里前两个判断都是正确的,第三个判断错误。因为30超出了数组分配的8个长度,调用_RTC_StackFailure 所以报了异常

以上就是微软官方检测栈的核心代码。

3.结构

参考下图

结尾

dotnet7。免费领取一套CLR/JIT/MSIL视频技术教程。你也可以加入我们(可加微信tyz_jhpt,备注:加群。拉你进去),一起学习超级技术。

相关推荐

msp的昌伟哥哥(伟昌怎么样)

佩戴HoloLens的多个用户可以使用场景共享特性来获取集合视野,并可以与固定在空间中某个位置的同一全息对象进行交互操作。这一切是通过空间锚共享(AnchorSharing)来实现的。为了使用共享服...

VOculus Rift、Gear VR平台开发者合作申请指南

编译/游戏陀螺案山子OculusHome平台——OculusRift和三星Gear主要的应用平台,包括PC版和移动版都可以使用。而现在使用的OculusShare平台,据悉将来也会整合到Ocu...

游戏中的&quot;状态机”和&quot;行为树”是什么?

状态机是一种模型,用于描述对象在不同状态下的行为和转换。在游戏里,状态机通常用于控制角色或NPC在不同状态下的行为。比如说,一个角色可以有多个状态,比如“待机”、“行走”、“攻击”、“受伤”等,每个状...

JetBrains Rider现已支持PS5和Xbox主机游戏开发

IT之家3月27日消息,Rider是一款由JetBrains出品的跨平台.NETIDE,在2024.3版本中,JetBrainsRider增加了对PlayStation5...

Unity WebGL 应用开发总结(unity webgl发布)

UnityWebGL应用开发总结1.开发环境软件版本Unity2020.1.0f1PyCharm2022.3.2Python3.7.32.编译WebGL对Unity项目进行WebGL编译时...

【6.Physics和动画】5.动画(动画电影)

5.动画现在,角色可以移动了,但在移动时形象一直不变,对于玩家来说比较生硬,本节中我们让角色在移动时能够播放动画。Unity2D游戏中,角色动画一般采用帧动画的形式来实现。所谓帧动画就是在每一帧显...

unity3d开发教程-开发环境搭建(unity3d开源项目)

一、安装Unity1、从官网下载UnityHub:https://unity.com/download,选择[DownloadforWindows]下载完成后,双击打开安装。一直点...

【2.UI元素】3.Panel and Button(ui界面元素)

3.PanelandButton3.1PanelPanel(面板)本质上就是预先设置好的Image。可以作为其他UI元素的父级。在层级窗口右击选择UI->Panel即可创建。...

揭秘!你玩的字节抖音小游戏制作流程公布

1.1注册字节开发者后台1.2Unity版本说明1.3检查AppID是否有效2.1创建项目2.2接入SDK3.1发布安卓Apk3.2发布双端WebGL3.3IOS15.4版本问题字节抖...

临时工闯下大祸《糖豆人》源代码更新时不慎泄露

这次《糖豆人》工作室Mediatonic的临时工闯下了大祸,在更新时一不留神把游戏的源代码给泄露了。当然,这次泄露之后,官方删除的动作也很快,但是没快过SteamDB创始人PavelDjundik...

为3D手游打造, Visual Studio Unity扩展下载

IT之家(www.ithome.com):为3D手游打造,VisualStudioUnity扩展下载7月30日消息,微软正式发布升级版VisualStudioToolsforUnity扩...

【2.C#基础】3.脚本入门(c# 脚本引擎)

3.脚本入门3.1脚本概要在上一节创建的脚本中,包含了一段模板代码,双击工程窗口中的脚本图标,系统自动打开代码编辑器(VSCode)可以看到代码如下图所示:说明:System.Collections...

unity专题:unitask库(1)(unitypackage)

UniTask是一个Unity引擎中的异步编程库,它可以帮助你在Unity项目中编写更简洁、高性能的异步代码。UniTask以Promise/Task的编程模式为基础,提供了与C#...

零基础带你看游戏内灰度效果实现原理

前言在Unity中实现后处理效果有两种方式:一种是通过使用Unity官方提供的Post-Processing插件。另外一种方式就是使用脚本获取到渲染后帧缓冲区的图像,再通过shader写后处理的效果,...

团结引擎自定义Scene视图的层叠面板和工具栏

团结引擎提供的了功能,可以为Scene视图添加层叠面板和自定义工具栏,这里学习官方的经典案例。创建层叠面板。总结需要三个步骤:1、创建编辑器脚本(需存放在Editor目录下)2、继承Overlay类,...

取消回复欢迎 发表评论: