CN105117332A - 一种栈溢出位置的检测方法 - Google Patents
一种栈溢出位置的检测方法 Download PDFInfo
- Publication number
- CN105117332A CN105117332A CN201510510578.6A CN201510510578A CN105117332A CN 105117332 A CN105117332 A CN 105117332A CN 201510510578 A CN201510510578 A CN 201510510578A CN 105117332 A CN105117332 A CN 105117332A
- Authority
- CN
- China
- Prior art keywords
- instruction
- stack overflow
- software
- program
- address
- 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.)
- Granted
Links
- 238000001514 detection method Methods 0.000 title claims description 28
- 238000000034 method Methods 0.000 claims abstract description 19
- 238000012360 testing method Methods 0.000 claims description 7
- 238000012544 monitoring process Methods 0.000 claims description 6
- 238000012546 transfer Methods 0.000 claims description 4
- 230000006870 function Effects 0.000 abstract description 34
- 230000037431 insertion Effects 0.000 abstract description 4
- 239000000872 buffer Substances 0.000 description 8
- 230000003068 static effect Effects 0.000 description 8
- 239000008186 active pharmaceutical agent Substances 0.000 description 4
- 238000012545 processing Methods 0.000 description 4
- 230000001960 triggered effect Effects 0.000 description 3
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 239000000523 sample Substances 0.000 description 2
- 230000005856 abnormality Effects 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004140 cleaning Methods 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 238000012966 insertion method Methods 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 238000010998 test method Methods 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种栈溢出位置的检测方法,涉及软件检测技术领域,用以快速检测栈溢出位置,帮助软件分析。本发明方法包括:定义一个集合A,利用程序插桩执行测试软件;当执行call执行时,获取到其入栈地址并将其存入集合A;在执行ret指令时,判断其返回地址是否在集合A中,如果在,则判定该函数未发生栈溢出,如果不在,则判定该函数存在栈溢出。本发明技术方案主要用于软件分析,能够快速准确定位出产生栈溢出的模块,并且通过进一步分析,可以准确定位到导致栈溢出的具体位置。本发明不需要被测软件的源码便可处理商用软件,能够检测所有函数类型,例如各类复杂的嵌套函数,具有更好的适应性。
Description
技术领域
本发明属于软件分析技术领域,是一种用于软件分析的栈溢出自动化检测方法,不需要被测软件的源码便可处理商用软件,能够检测所有函数类型。
背景技术
栈溢出就是缓冲区溢出的一种。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,造成缓冲区的溢出,造成程序崩溃或使程序转而执行其它指令。
缓冲区溢出漏洞存在普遍,且其攻击易于实现。每当一个函数调用发生时,调用者会在栈中留下一个活动纪录,它包含了函数结束时返回的地址。而栈溢出主要指栈的关键内容被外界所改变,如果局部缓冲区发生溢出(超过了缓冲区的上边界),即往栈生长方向的相反方向生长,那么就有可能覆盖一些关键指针,比如函数返回地址等。此时,程序的运行就会发生异常,比如返回地址的修改将使程序运行跳转不可预料的地址,例如跳转到恶意程序等。
程序插桩,最早是由J.C.Huang教授提出的,它是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针,通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。
根据检测发生的阶段,栈溢出的检测可以分为静态检测技术和动态检测技术。静态检测技术指的是不依赖于程序的运行就能检测出栈溢出的错误,静态检测一般发生在编译前和编译后。动态检测技术指的是检测过程必须依赖于程序的运行,一般需要在程序中插入或者修改一些指令来检测栈的溢出。根据插入方式的不同,动态检测技术可以进一步划分为静态插装和动态插装。静态插装技术主要是指对程序的修改发生在程序运行之前。目前静态插装技术主要有两类:基于源码的静态插装技术和基于二进制代码的静态插装技术。而动态插装指的是在程序运行过程中对二进制代码进行修改,在函数的入口和出口插入一些指令来完成对栈使用情况的监控。
现在的技术对栈溢出位置的检测都是基于源码重新编译的,不能针对已经编译好的软件。
发明内容
本发明的目的在于提供一种针对分析软件栈溢出位置的检测方法,该方法只判断函数返回地址在其入口地址集合中,并不要求其一定为本函数入口地址,能够适应所有函数调用方式。该方法不需要软件源码,在运行软件过程中,通过插桩方式在指定位置插入代码,就能够进行检测,因而能方便地测试商用嵌入式软件。且判断方式简单,能够快速检测出是否发生栈溢出现象,并通过具体分析,能够定位到发生栈溢出的具体位置。
为了达到上述目的,本发明采用如下技术方案:
一种用于软件分析的栈溢出自动化检测方法及装置,其特征在于,包括以下器件:
插桩工具:负责编译监测程序,从监测程序接收检测命令并启动被测软件,获取被测软件运行时信息再发送给监测程序;
监测程序:负责实际执行部分的主要功能,包括:设置监测具体位置,以及监测测试软件运行时的具体信息,获取指定寄存器和内存的值,建立集合A并判断,当执行call指令时,获取到其入栈地址并将其存入集合A;在执行ret指令时,判断其返回地址是否在集合A中,如果不在,则判定该函数存在栈溢出。
测试软件:被测软件启动之后的运行部分;
在本发明中,定义了一个集合,利用程序插桩执行测试软件;当执行call指令时,获取到其入栈地址并将其存入集合A;在执行ret指令时,判断其返回地址是否在集合A中,如果不在,则判定该函数存在栈溢出。该方法主要包括以下步骤:
S1:建立集合A,启动测试软件开始运行;
S2:通过程序插桩进行指令解析,根据监测程序的设置获取测试软件执行的指令与运行信息,判定是否是转移类指令或程序结束指令,是程序结束指令则检测结束;
S3:判定程序转移类指令,如果为call指令,则获取其入口地址,如果为ret指令,则转到步骤S5;
S4:将入口地址存入集合A中,转到步骤S2;判断其返回地址是否存在集合A中,如果是,则转到步骤S1,如果不是,则发生栈溢出,检测结束。
S5:获取返回地址及其详细信息;
S6:与集合A中的地址进行比较,判断返回地址是否存在集合A中,如果是,则转到步骤S2,如果不是,则发生栈溢出,检测结束;
在本发明中,检测call指令从插桩返回的运行信息中提取到的入口地址都保存到集合中,检测ret指令获得返回地址后,直接判定返回地址是否在集合中,命中则正常,没命中则表示发生了栈溢出现象。
在本发明中,不要求返回地址必须与入栈地址一一对应,能够对各种复杂函数进行检测,具有更好的适应性。
本发明同现有技术相比,其有益效果表现在:
一、判定逻辑简单,探测获取入口位置添加到集合中,探测获取返回位置,然后判定是否在集合中,来判定是否发生了栈溢出,执行效率高;
二、插桩技术是二进制分析框架,通过插桩技术在目标代码中进行代码插入,由于目标代码的格式主要和操作系统相关,和具体的编程语言及版本无关,因此我们的分析方法即使在无源码的各类商用软件上也能得到应用;
三、本发明不强制要求函数出口与入口一一对应,能够适应几乎所有函数调用方式。例如,在大多数时候,外部函数的调用是嵌套的,本发明也能够处理嵌套的外部函数。
附图说明
图1是本发明的总体架构图;
图2为本发明的溢出检测流程图。
具体实施方式
下面将结合附图及具体实施方式对本发明作进一步的描述。
实施例
在本发明中,使用intel公司开发的用于程序测试的一款工具软件Pin,它是一款动态二进制分析框架,可以用于构建强大的动态程序分析工具,支持32位、64位的Linux和Windows的可执行程序,可以检测程序运行过程中的命令、内存、地址等的详细信息。Intel为了封锁技术,并没有让Pin开源,但是提供了其编译版本供使用,用户可以以外挂的形式扩展自定义的分析函数。
简单来说Pin就是在可执行二进制代码中插入一些探测函数,用于观察、记录、分析等。通过Pin提供的API可以编写各种分析函数,这样程序运行完以后,统计和分析结果也同时产生。
在Pin框架下一个进程运行时,真正的运行代码包括三个部分:进程本身的二进制、Pin框架code、pintoolcode。
假设我们要监测某程序运行过程中是否发生了栈溢出,那么我们首先需要确定两点,即在何处分析,以及如何分析。因此,本发明在pintool中需要确定代码具体插入位置以及记录当前环境的一些参数并进行分析。
表1列出了本实施例使用到的pintool提供的API函数及其使用说明。
表1pintool常用API
| 序号 | API | 说明 |
| 1 | itrace | 显示每个指令执行的内存地址 |
| 2 | malloctrace | 记录函数参数传递到函数的值或返回的值 |
| 3 | pinatrace | 检测指令读取和写入的内存地址 |
| 4 | safecopy | 记录程序从内存中复制信息到寄存器的指令 |
| 5 | malloctrace | 输出malloc()和free()的输入参数以及malloc()的返回值 |
一、设置Pin的编译环境:pin没有图形界面窗口,全部操作均需在dos界面下完成,要运行pin首先要安装对应版本visualstudio作为编译工具,在此之前还需要将pin加入环境变量。
二、编写pintool文件:Pin只是一个插装的平台或框架,执行具体的插装任务要通过定义Pintool来实现,pintool的主函数可分为三个部分,输出文件建立部分、程序检测函数部分和结尾部分,输出文件建立部分确定输出文件的格式和说明内容,程序检测函数部分调用各函数对可执行程序进行检测,结尾部分一般为其自定义的Fini函数,用来做将检测数据写入输出文件、关闭文件等的收尾工作,显然,第二部分为最重要部分,其具体实施步骤如下:
①建立集合A;
②注册三个函数来处理事件,分别对应TEXT_PUSH事件、TEXT_POP事件和TEXT_EXIT事件;TEXT_PUSH表示执行到了push指令,开始进行入栈前;TEXT_POP表示执行到了POP指令,出栈并返回;TEXT_EXIT表示被测软件执行完毕,正常退出;
③编译pintool文件,得到.dll文件;
④启动命令运行被测软件和编译好的pintool文件,等待事件触发。
三、事件处理流程:对三个事件进行特殊处理,分别是TEXT_PUSH、TEXT_POP和TEXT_EXIT。
当TEXT_ACCESS触发时,处理步骤如下:
a、获取当前指令执行的的的内存地址;
b、判断该地址是否已存在于集合A中,如果是,则丢弃数据,如果不是,则将该地址加入集合A中。
当TEXT_POP触发时,处理步骤如下:
a、获取当前指令执行的的的内存地址;
b、获得当前指令,并采用开源反汇编软件将其反汇编,所获得的详细信息存储在一个数据结构中;
c、获取当前EIP寄存器的内容;
d、判断寄存器内容是否在集合A中,如果是,则未发生栈溢出,如果不是,则发生了栈溢出现象,并将其对应的内存地址数据结构中的数据输出。
对TEXT_EXIT事件的处理流程较简单,主要负责当被测软件结束后的清理工作,包括关闭被测软件、释放内存空间等。
本实施方式提出的检测栈溢出位置的方式有效且简单,能够处理现实中的中复杂的函数调用情况。例如,在大多数时候,外部函数的调用是嵌套的,本方法也能够处理嵌套的外部函数。
以上仅是本发明众多具体应用范围中的代表性实施例,对本发明的保护范围不构成任何限制。凡采用变换或是等效替换而形成的技术方案,均落在本发明权利保护范围之内。
Claims (2)
1.一种栈溢出位置的检测方法,其特征在于,包括以下步骤
该方法主要包括以下步骤:
S1:建立集合A,运行测试软件;
S2:用插桩程序执行测试软件,根据监测程序的设置获取测试软件执行的指令与运行信息,判定是否是转移类指令或程序结束指令,是转移类指令则执行S3,是程序结束指令则执行步骤S7;
S3:判定程序转移类指令,如果为call指令,则获取该指令下一条指令的执行地址,即为入口地址,如果为ret指令,则转到步骤S5;
S4:将入口地址存入集合A中,转到步骤S2;判断其返回地址是否存在集合A中,如果是,则转到步骤S1,如果不是,则发生栈溢出,检测结束;
S5:获取返回地址及其详细信息;
S6:与集合A中的地址进行比较,判断返回地址是否存在集合A中,如果是,则转到步骤S2,如果不是,则发生栈溢出;
S7:检测结束。
2.根据权利要求1所述的一种栈溢出位置的检测方法,其特征在于,所述监测程序用于设置监测测试软件具体位置,以及运行时具体信息,获取指定寄存器和内存的值,建立集合A。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN201510510578.6A CN105117332B (zh) | 2015-08-19 | 2015-08-19 | 一种栈溢出位置的检测方法 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN201510510578.6A CN105117332B (zh) | 2015-08-19 | 2015-08-19 | 一种栈溢出位置的检测方法 |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| CN105117332A true CN105117332A (zh) | 2015-12-02 |
| CN105117332B CN105117332B (zh) | 2018-08-14 |
Family
ID=54665330
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN201510510578.6A Expired - Fee Related CN105117332B (zh) | 2015-08-19 | 2015-08-19 | 一种栈溢出位置的检测方法 |
Country Status (1)
| Country | Link |
|---|---|
| CN (1) | CN105117332B (zh) |
Cited By (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN106228065A (zh) * | 2016-08-08 | 2016-12-14 | 武汉绿色网络信息服务有限责任公司 | 一种缓冲区溢出漏洞的定位方法与装置 |
| CN110941552A (zh) * | 2019-11-20 | 2020-03-31 | 广州大学 | 一种基于动态污点分析的内存分析方法及装置 |
| CN111191243A (zh) * | 2019-08-15 | 2020-05-22 | 腾讯科技(深圳)有限公司 | 一种漏洞检测方法、装置和存储介质 |
| CN112685744A (zh) * | 2020-12-28 | 2021-04-20 | 安芯网盾(北京)科技有限公司 | 一种利用栈相关寄存器检测软件漏洞的方法及装置 |
Citations (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US20070180431A1 (en) * | 2002-11-22 | 2007-08-02 | Manish Agarwala | Maintaining coherent synchronization between data streams on detection of overflow |
| CN101241464A (zh) * | 2007-02-05 | 2008-08-13 | 中兴通讯股份有限公司 | 一种检测堆栈帧破坏的方法 |
| CN103221960A (zh) * | 2012-12-10 | 2013-07-24 | 华为技术有限公司 | 恶意代码的检测方法及装置 |
| CN104598377A (zh) * | 2014-12-29 | 2015-05-06 | 大唐移动通信设备有限公司 | 一种打桩测试方法和装置 |
-
2015
- 2015-08-19 CN CN201510510578.6A patent/CN105117332B/zh not_active Expired - Fee Related
Patent Citations (4)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| US20070180431A1 (en) * | 2002-11-22 | 2007-08-02 | Manish Agarwala | Maintaining coherent synchronization between data streams on detection of overflow |
| CN101241464A (zh) * | 2007-02-05 | 2008-08-13 | 中兴通讯股份有限公司 | 一种检测堆栈帧破坏的方法 |
| CN103221960A (zh) * | 2012-12-10 | 2013-07-24 | 华为技术有限公司 | 恶意代码的检测方法及装置 |
| CN104598377A (zh) * | 2014-12-29 | 2015-05-06 | 大唐移动通信设备有限公司 | 一种打桩测试方法和装置 |
Non-Patent Citations (2)
| Title |
|---|
| 刘露平等: "基于动态插桩的缓冲区溢出漏洞检测技术研究", 《信息安全与通信保密》 * |
| 董鹏程等: "基于动态二进制平台的缓冲区溢出过程分析", 《计算机工程》 * |
Cited By (6)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN106228065A (zh) * | 2016-08-08 | 2016-12-14 | 武汉绿色网络信息服务有限责任公司 | 一种缓冲区溢出漏洞的定位方法与装置 |
| CN106228065B (zh) * | 2016-08-08 | 2020-06-05 | 武汉绿色网络信息服务有限责任公司 | 一种缓冲区溢出漏洞的定位方法与装置 |
| CN111191243A (zh) * | 2019-08-15 | 2020-05-22 | 腾讯科技(深圳)有限公司 | 一种漏洞检测方法、装置和存储介质 |
| CN110941552A (zh) * | 2019-11-20 | 2020-03-31 | 广州大学 | 一种基于动态污点分析的内存分析方法及装置 |
| CN110941552B (zh) * | 2019-11-20 | 2023-07-07 | 广州大学 | 一种基于动态污点分析的内存分析方法及装置 |
| CN112685744A (zh) * | 2020-12-28 | 2021-04-20 | 安芯网盾(北京)科技有限公司 | 一种利用栈相关寄存器检测软件漏洞的方法及装置 |
Also Published As
| Publication number | Publication date |
|---|---|
| CN105117332B (zh) | 2018-08-14 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US12093398B2 (en) | Vulnerability analysis and reporting for embedded systems | |
| CN109583200B (zh) | 一种基于动态污点传播的程序异常分析方法 | |
| US7788535B2 (en) | Means and method for debugging | |
| JP5523872B2 (ja) | プログラムの動的分析方法及びその装置 | |
| CN106354630B (zh) | 一种基于动态符号执行的软件缺陷检测方法 | |
| CN104375941B (zh) | 可执行程序测试用例集二进制代码覆盖率自动化评估方法 | |
| CN101354675B (zh) | 一种嵌入式软件动态内存检测的方法 | |
| CN102622536A (zh) | 一种恶意代码捕获方法 | |
| CN107526970B (zh) | 基于动态二进制平台检测运行时程序漏洞的方法 | |
| CN110941552A (zh) | 一种基于动态污点分析的内存分析方法及装置 | |
| CN105117332B (zh) | 一种栈溢出位置的检测方法 | |
| CN104252402A (zh) | 一种程序调试方法及装置 | |
| CN105868626B (zh) | 基于控制流粗粒度完整性的监控软件业务行为的方法 | |
| CN105260312B (zh) | 一种多核实时系统应用数据竞争错误的调试方法 | |
| CN101458630A (zh) | 一种基于硬件模拟器的自修改代码识别方法 | |
| CN110187884B (zh) | 一种多线程应用场景下的访存指令插桩优化方法 | |
| CN107844703B (zh) | 一种基于Android平台Unity3D游戏的客户端安全检测方法及装置 | |
| CN103019865B (zh) | 虚拟机监控方法和系统 | |
| CN116340081A (zh) | 一种基于硬件虚拟化的riscv内存访问违例检测方法及装置 | |
| US20180349267A1 (en) | Asynchronous operation query | |
| JP5766650B2 (ja) | 情報処理装置、監視方法および監視プログラム | |
| CN104572482B (zh) | 一种过程变量的存储方法及装置 | |
| CN118860762A (zh) | 基于数字信号处理器的仿真系统及方法 | |
| CN114443418B (zh) | 一种基于硬件虚拟化的riscv内存溢出漏洞检测方法及装置 | |
| CN106095631B (zh) | 一种基于有限状态机实现的多周期非流水线cpu动态调试方法 |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| C06 | Publication | ||
| PB01 | Publication | ||
| C10 | Entry into substantive examination | ||
| SE01 | Entry into force of request for substantive examination | ||
| GR01 | Patent grant | ||
| GR01 | Patent grant | ||
| CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180814 |
|
| CF01 | Termination of patent right due to non-payment of annual fee |