CN103870767B - 基于ebp构造的栈栈帧内容保护方法 - Google Patents
基于ebp构造的栈栈帧内容保护方法 Download PDFInfo
- Publication number
- CN103870767B CN103870767B CN201410102934.6A CN201410102934A CN103870767B CN 103870767 B CN103870767 B CN 103870767B CN 201410102934 A CN201410102934 A CN 201410102934A CN 103870767 B CN103870767 B CN 103870767B
- Authority
- CN
- China
- Prior art keywords
- ebp
- frame
- stack
- page
- shadow
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/52—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow
- G06F21/53—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow by executing in a restricted environment, e.g. sandbox or secure virtual machine
Abstract
一种基于ebp构造的栈栈帧内容保护方法,包括1、初始化的步骤;2、当函数调用发生时,保存当前ebp寄存器数值,并更改其值为指向page所在内存页的步骤;3、在被调用函数执行期间,捕获其对ebp链的定位操作并对被调用函数所定位的栈帧提供保护的步骤;4、被调用函数执行完成返回时,查看栈帧内容和恢复的步骤。本发明中,被调用函数对栈中的栈帧定位操作被透明地重定向到影子栈帧中,被调用函数在随后针对目标栈帧的任何修改操作都将在影子栈帧中完成,实现了对原有栈帧的保护。同时,在被调用函数返回时,将原有栈帧同影子栈帧内容进行比较,可以确定被调用函数更改了系统中的哪些栈帧内容,为分析被调用函数的栈帧行为提供支持。
Description
技术领域
本发明涉及计算机系统安全技术领域,具体来讲是一种基于ebp构造的栈栈帧内容保护方法。
背景技术
栈保存着程序在运行过程中产生的数据以及用于函数调用与返回的控制信息,x86架构下,相同特权级内的函数调用不会引起栈切换,使得栈在发起调用的函数(调用者,caller)与被调用函数(被调用者,callee)之间共享。当被调用函数在执行时,调用者运行所需数据已经存在于栈内,被调用者则可轻易获取并修改这些信息。
在基于ebp(extended base pointer,拓展基址指针寄存器)构造的栈中,每一次函数调用都产生一个栈帧(stack frame),栈帧中保存着该次函数调用对应参数、返回地址以及该函数在运行过程中产生的数据。各个栈帧通过ebp连通,形如单向链表,链表表头由当前ebp寄存器指定。如图1所示,包含三个函数栈帧A、B和C,所示函数调用顺序为函数C调用函数B,函数B调用函数A,系统当前正在运行函数A中的代码。当前ebp寄存器保存着栈帧A中的[ebp]所在地址([ebp]表示压入栈中的ebp寄存器,参照图1箭头1所示),A.[ebp]则记录着B.[ebp]所在地址,B.[ebp]中保存着C.[ebp]所在栈中的地址,形成形如ebp->A.[ebp]->B.[ebp]->C.[epp]的单向ebp链。函数A对应栈帧为系统中的最新栈帧,函数A中的代码便可通过上述关系去遍历当前系统中的所有栈帧,继而读取甚至修改各个栈帧的内容。
当前针对系统栈的保护主要集中在防护缓冲区溢出(buffer overflow)和ROP(面向返回地址编程,return oriented programming)攻击上,而忽略了栈帧内容本身的安全性。
发明内容
本发明的目的是提供一种基于ebp构造的栈栈帧内容保护方法,通过监控系统栈中的已有ebp链,继而拦截并修改被调用函数对栈帧所进行的定位操作,使得被调用函数定位到错误的内存处,达到对原有栈帧的保护。
实现本发明目的的技术方案如下:一种基于ebp构造的栈栈帧内容保护方法,包括初始化的步骤,包括
1.1 向内核申请一个内存页,其首地址记为page;
1.2 将page对应页表项标记为不存在;
当函数调用发生时,保存当前ebp寄存器数值,并更改其值为指向page所在内存页的步骤,包括
2.1 产生一个计数器i,初值赋为0;
2.2 当函数调用发生时,保存当前ebp寄存器数值为ebp_old,更改当前ebp寄存器数值为ebp_new,使得ebp_new=page+i;
在被调用函数执行期间,捕获其对ebp链的定位操作并对被调用函数所定位的栈帧提供保护的步骤,包括
3.1 若被调用函数通过ebp链去定位系统之前的已有栈帧,则触发缺页中断;否则,等待函数调用返回;
3.2 在缺页中断处理中,判断CR2寄存器数值是否等于ebp_new;若相等,则根据ebp_new数值计算其相对于page的偏移量i=ebp_new–page;若不相等,则等待函数调用返回;
3.3 拷贝栈帧frame_i的内容到其它内存处形成影子栈帧frame_i_shadow;
3.4 累加计数器i,即i=i+1;
3.5 将page+i赋值给frame_i_shadow.[ebp],所述frame_i_shadow.[ebp]为压入影子栈帧frame_i_shadow的ebp寄存器;
3.6 通过指令模拟操作,将被调用函数对上述步骤3.3中栈帧frame_i的定位操作重定向到frame_i_shadow.[ebp]所在地址处,形成虚拟ebp链;
3.7 转步骤3.1;
被调用函数执行完成返回时,查看栈帧内容和恢复的步骤,包括
4.1 比较各个影子栈帧frame_i_shadow与原有栈帧frame_i的内容,查看其内容是否被更改;
4.2 将保存的ebp_old数值恢复到当前ebp寄存器中。
进一步地,所述指令模拟操作包括:
分析当前被调用函数触发缺页的指令,将其中寻址内存地址ebp_new处的操作数改为寻址地址frame_i_shadow.[ebp],再模拟出修改后的临时指令;
将返回地址数值改为指向当前被调用函数触发缺页的指令的下一条指令所在地址。
本发明的有益效果在于:被调用函数对栈中的栈帧定位操作被透明地重定向到影子栈帧中,被调用函数在随后针对目标栈帧的任何修改操作都将在影子栈帧中完成,不会影响到系统中原有栈帧的安全,实现了对原有栈帧的保护。同时,在被调用函数返回时,将原有栈帧同影子栈帧内容进行比较,可以确定被调用函数更改了系统中的哪些栈帧内容,为分析被调用函数的栈帧行为提供支持。
附图说明
图1是基于ebp构造的栈结构示意图;
图2是本发明的流程图;
图3是压入栈中被修改的ebp寄存器的示意图;
图4是拷贝栈帧的内容形成影子栈帧的示意图;
图5是虚拟ebp链的形成示意图;
图6是两次定位操作产生的虚拟ebp链的示意图。
具体实施方式
本发明的总体思路是:当函数调用发生时,更改当前ebp寄存器数值,使其指向系统中一个不存在的内存页。被更改后的ebp会被系统压入到栈中形成[ebp],若被调用函数通过ebp链定位系统已有栈帧,则会触发缺页异常。在缺页异常中将被调用函数定位的栈帧内容拷贝到其它内存地址处形成影子栈帧,通过指令模拟技术将被调用函数的栈帧定位操作重定向到影子栈帧中。
下面结合附图具体描述本发明的实施方式。
如图2所示,基于ebp构造的栈栈帧内容保护方法,包括
1、初始化的步骤,包括
1.1 向内核申请一个内存页,其首地址记为page;
1.2 将page对应页表项标记为不存在;
上述初始化的步骤,申请page内存页用于引发缺页中断。
2、当函数调用发生时,保存当前ebp寄存器数值,并更改其值为指向page所在内存页的步骤,包括
2.1 产生一个计数器i,初值赋为0;计数器i用于标记系统中的栈帧。
2.2 当函数调用发生时,保存当前ebp寄存器数值为ebp_old,更改当前ebp寄存器数值
为ebp_new,使得ebp_new=page+i;该值随后会被压入栈中,如图3中栈帧A所示。
3、在被调用函数执行期间,捕获其对ebp链的定位操作并对被调用函数所定位的栈帧提供保护的步骤,包括
3.1 若被调用函数通过ebp链去定位系统之前的已有栈帧,则触发缺页中断;否则,等待函数调用返回;如图3所示,此时,原有ebp链已经断裂,page所在内存页在页表项中被标记为不存在,引用1处的[ebp]去定位栈B会触发缺页中断。
3.2 在缺页中断处理中,判断CR2寄存器数值是否等于ebp_new;若相等,则根据ebp_new数值计算其相对于page的偏移量i=ebp_new–page;若不相等,则等待函数调用返回;其中,CR2为页故障线性地址寄存器,用来保存最近一次出现页故障时的虚拟地址。
3.3 拷贝栈帧frame_i的内容到其它内存处形成影子栈帧frame_i_shadow;如图4所示,拷贝栈帧B的内容,形成影子栈帧frame_B_shadow。
3.4 累加计数器i,即i=i+1;
3.5 将page+i赋值给frame_i_shadow.[ebp];
3.6 通过指令模拟操作,将被调用函数对上述栈帧的定位操作重定向到frame_i_shadow.[ebp]所在地址处,形成虚拟ebp链;如图5所示,重定向被调用函数的栈帧定位操作到影子栈帧中,形成一个虚拟的ebp链,如箭头2所示。箭头1处的内容并不实际指向frame_B_shadow,通过重定向操作,使得被调用函数感觉存在箭头2所示的指向关系,即让当前栈帧的前一个栈帧看起来是frame_B_shadow。
其中,指令模拟(Instruction simulation,参见维基百科http://en.wikipedia.org/wiki/Instruction_set_simulator))包括:1、分析当前被调用函数触发缺页的指令,将其中寻址内存地址ebp_new处的操作数改为寻址地址frame_i_shadow.[ebp],再模拟出修改后的临时指令;2、将返回地址数值改为指向当前被调用函数触发缺页的指令的下一条指令所在地址。此处的返回地址指等缺页中断执行完成后,用于返回被调用函数的地址。
3.7 转步骤3.1;
如图6所示,被调用函数通过frame_B_shadow继续定位之前栈帧C,产生一个新的影子
栈帧frame_C_shadow,形成A--->frame_B_shadow--->frame_C_shadow的虚拟栈帧关系。
4、被调用函数执行完成返回时,查看栈帧内容和恢复的步骤,包括
4.1 比较各个影子栈帧frame_i_shadow与原有栈帧frame_i的内容,查看其内容是否被更改;这里,将原有栈帧同影子栈帧内容进行比较,可以确定被调用函数更改了系统中的哪些栈帧内容,为分析被调用函数的栈帧行为提供支持。
4.2 将保存的ebp_old数值恢复到当前ebp寄存器中。
Claims (2)
1.一种基于ebp构造的栈栈帧内容保护方法,其特征在于,包括
初始化的步骤,包括
1.1向内核申请一个内存页,其首地址记为page;
1.2将page对应页表项标记为不存在;
当函数调用发生时,保存当前ebp寄存器数值,并更改其值为指向page所在内存页的步骤,包括
2.1产生一个计数器i,初值赋为0;
2.2当函数调用发生时,保存当前ebp寄存器数值为ebp_old,更改当前ebp寄存器数值为ebp_new,使得ebp_new=page+i;
在被调用函数执行期间,捕获其对ebp链的定位操作并对被调用函数所定位的栈帧提供保护的步骤,包括
3.1若被调用函数通过ebp链去定位系统之前的已有栈帧,则触发缺页中断;否则,等待函数调用返回;
3.2在缺页中断处理中,判断CR2寄存器数值是否等于ebp_new;若相等,则根据ebp_new数值计算其相对于page的偏移量i=ebp_new–page;若不相等,则等待函数调用返回;
3.3拷贝栈帧frame_i的内容到其它内存处形成影子栈帧frame_i_shadow;
3.4累加计数器i,即i=i+1;
3.5将page+i赋值给frame_i_shadow.[ebp],所述frame_i_shadow.[ebp]为压入影子栈帧frame_i_shadow的ebp寄存器;
3.6通过指令模拟操作,将被调用函数对上述步骤3.3中栈帧frame_i的定位操作重定向到frame_i_shadow.[ebp]所在地址处,形成虚拟ebp链;
3.7转步骤3.1;
被调用函数执行完成返回时,查看栈帧内容和恢复的步骤,包括
4.1比较各个影子栈帧frame_i_shadow与原有栈帧frame_i的内容,查看其内容是否被更改;
4.2将保存的ebp_old数值恢复到当前ebp寄存器中。
2.如权利要求1所述的基于ebp构造的栈栈帧内容保护方法,其特征在于,所述指令模拟操作包括
分析当前被调用函数触发缺页的指令,将其中寻址内存地址ebp_new处的操作数改为寻址地址frame_i_shadow.[ebp],再模拟出修改后的临时指令;
将返回地址数值改为指向当前被调用函数触发缺页的指令的下一条指令所在地址。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410102934.6A CN103870767B (zh) | 2014-03-19 | 2014-03-19 | 基于ebp构造的栈栈帧内容保护方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410102934.6A CN103870767B (zh) | 2014-03-19 | 2014-03-19 | 基于ebp构造的栈栈帧内容保护方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103870767A CN103870767A (zh) | 2014-06-18 |
CN103870767B true CN103870767B (zh) | 2017-02-01 |
Family
ID=50909289
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410102934.6A Active CN103870767B (zh) | 2014-03-19 | 2014-03-19 | 基于ebp构造的栈栈帧内容保护方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103870767B (zh) |
Families Citing this family (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106203076B (zh) * | 2016-06-24 | 2020-03-17 | 武汉绿色网络信息服务有限责任公司 | 一种利用ebp判断恶意文件的方法 |
CN108363930B (zh) * | 2018-03-21 | 2020-06-12 | 中国人民解放军战略支援部队信息工程大学 | 一种内存数据保护方法及系统 |
CN110874301B (zh) * | 2018-08-30 | 2022-09-13 | 腾讯科技(深圳)有限公司 | 程序卡顿信息的获取方法和装置 |
CN109376022B (zh) * | 2018-09-29 | 2021-12-14 | 中国科学技术大学 | 一种提升Halide语言在多核系统执行效率的线程模型实现方法 |
CN109785537B (zh) * | 2018-12-29 | 2022-09-30 | 奇安信安全技术(珠海)有限公司 | 一种atm机的安全防护方法及装置 |
CN111209042B (zh) * | 2020-01-06 | 2022-08-26 | 北京字节跳动网络技术有限公司 | 一种建立函数栈的方法、装置、介质和电子设备 |
CN112882695B (zh) * | 2021-03-02 | 2023-11-28 | 百果园技术(新加坡)有限公司 | 传参方法、装置、计算机设备及存储介质 |
CN113238800B (zh) * | 2021-05-25 | 2022-06-28 | 上海安路信息科技股份有限公司 | 堆栈帧结构和函数调用方法及系统 |
CN114781322B (zh) * | 2022-04-24 | 2023-04-25 | 苏州睿芯集成电路科技有限公司 | Cpu芯片仿真加速中针对无mmu环境的内存状态恢复方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1885275A (zh) * | 2005-06-20 | 2006-12-27 | 中兴通讯股份有限公司 | 一种嵌入式系统及其实时内存监控处理方法 |
CN101866406A (zh) * | 2010-06-18 | 2010-10-20 | 中国科学院软件研究所 | 一种栈溢出攻击防御方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8375373B2 (en) * | 2010-04-19 | 2013-02-12 | Microsoft Corporation | Intermediate language support for change resilience |
-
2014
- 2014-03-19 CN CN201410102934.6A patent/CN103870767B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1885275A (zh) * | 2005-06-20 | 2006-12-27 | 中兴通讯股份有限公司 | 一种嵌入式系统及其实时内存监控处理方法 |
CN101866406A (zh) * | 2010-06-18 | 2010-10-20 | 中国科学院软件研究所 | 一种栈溢出攻击防御方法 |
Non-Patent Citations (1)
Title |
---|
《通信领域中嵌入式软件异常处理模块分析与实现》;何先波等;《计算机工程》;20070531;第33卷(第9期);第69-71页 * |
Also Published As
Publication number | Publication date |
---|---|
CN103870767A (zh) | 2014-06-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103870767B (zh) | 基于ebp构造的栈栈帧内容保护方法 | |
US8046544B2 (en) | Garbage collection barrier with direct user mode traps | |
JP2014174998A5 (zh) | ||
JP5608594B2 (ja) | プレロード命令制御 | |
KR101665219B1 (ko) | 네스티드 에뮬레이션 및 동적 링킹 환경 | |
JP2010282252A5 (zh) | ||
WO2008005825A3 (en) | Methods, systems, and computer program products for providing access to addressable entities using a non-sequential virtual address space | |
CN102663312A (zh) | 一种基于虚拟机的rop攻击检测方法及系统 | |
CN114730249A (zh) | 不同类型的存储器之间的页迁移的减少 | |
CN102662726B (zh) | 虚拟机的模拟方法和计算机设备 | |
CN106294089A (zh) | 辅助对被监控内存空间的访问监控的方法和装置 | |
JP5318197B2 (ja) | ホストデータ処理装置内におけるデバイスエミュレーションのサポート | |
US20060184713A1 (en) | Method for operating a virtual machine computer system running guest operating systems on a central processing means virtualized by a host system having register stack engine functionality | |
JP2022505011A (ja) | メモリ・アクセスを制御するための装置及び方法 | |
CN107239410B (zh) | 基于动态插桩的大块内存分配系统及方法 | |
EP3341834B1 (en) | Exception handling | |
US11397541B2 (en) | Controlling guard tag checking in memory accesses | |
CN107818034A (zh) | 监测计算机设备中的进程的运行空间的方法以及装置 | |
US20190026649A1 (en) | System and method for generating a file execution record of address tuples | |
JP2001265620A (ja) | Romのプログラムデバッグ方式 | |
CN109144575A (zh) | 跨操作系统运行应用的装置、方法、电子设备和存储器 | |
TWI660307B (zh) | 二元碼轉譯裝置及方法 | |
CA2557688A1 (en) | System and method for implementing software breakpoints in an interpreter | |
CN105988811B (zh) | 获取操作系统的内核控制流程图的方法和装置 | |
CN103197957B (zh) | 一种用户程序执行时页面复制方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |