v:* { }
o:* { }
w:* { }
.shape { }p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 10.5pt; font-family: "Calibri", "sans-serif" }
p.MsoHeader,li.MsoHeader,div.MsoHeader { margin: 0cm; margin-bottom: .0001pt; text-align: center; border: none; padding: 0cm; font-size: 9.0pt; font-family: "Calibri", "sans-serif" }
p.MsoFooter,li.MsoFooter,div.MsoFooter { margin: 0cm; margin-bottom: .0001pt; font-size: 9.0pt; font-family: "Calibri", "sans-serif" }
a:link,span.MsoHyperlink { color: blue; text-decoration: underline }
a:visited,span.MsoHyperlinkFollowed { color: purple; text-decoration: underline }
p.MsoAcetate,li.MsoAcetate,div.MsoAcetate { margin: 0cm; margin-bottom: .0001pt; text-align: justify; font-size: 9.0pt; font-family: "Calibri", "sans-serif" }
span.Char { }
span.Char0 { }
span.Char1 { }
span.SpellE { }
span.GramE { }
.MsoChpDefault { }
div.WordSection1 { }table.MsoNormalTable { font-size: 10.5pt; font-family: "Calibri", "sans-serif" }

Detours修改段属性漏洞

受影响的软件及系统

Detours3.0和之前版本

简介

这个问题将其定位为一个漏洞可能不太合适,更可能是Detours的一个BUG,但是因为该缺陷会造成漏洞利用变得容易,因此将其定义为漏洞。其主要问题就是Detours在使用过程中会将之前的可执行段修改为可写,但是修改完之后,没有将段属性修改回来。

漏洞危害

一些安全软件出于安全考虑,会把安全模块注入到IE,Office等软件里面,而很多注入模块里面使用Detours库对系统API进行Hook操作,Detours库进行Hook操作时(DetourAttachEx函数)会将相关模块的PE头(具体是DosHeader,不可写段)修改为可写可读可执行,然后写入一些特殊数据,但是后面没有修改成原始属性。这样就会破坏这些模块的段属性,造成一些其它漏洞利用时降低了绕过DEP的难度。

漏洞原理

Detours进行Inline Hook操作时,会在相关模块PE头的DosHeader里面写入一个特殊的Detours!字符串(用于标识该模块被Hook过)。因为一般DosHeader是不可写的,因此Detours会先把该处修改为可写可读可执行属性,然后再修改。

但是改完之后,Detours并没有恢复这块内存的原始属性,这样就导致这块内存一直处于可写可读可执行属性。这样问题就产生了。

可以调试下IE试试,一般来说IEXPLORE模块本身不会被Hook,我们看看它的基址的内存属性。

0:040> lm

start    end       module name

00f50000 01016000   IEXPLORE   (deferred)

0:040> !address00f50000

Failed to map Heaps (error 80004005)

Usage:                 Image

Allocation Base:       00f50000

Base Address:          00f50000

End Address:           00f51000

Region Size:           00001000

Type:                  01000000  MEM_IMAGE

State:                 00001000   MEM_COMMIT

Protect:               00000002   PAGE_READONLY

More info:             lmv m IEXPLORE

More info:             !lmi IEXPLORE

More info:             ln 0xf50000

而mshtml则是安全软件最喜欢Hook的模块,看看它的基址的内存属性。

0:040> lmvmmshtml

start    end       module name

63d70000 64df3000   MSHTML     (deferred)

Image path:C:\windows\system32\MSHTML.dll

Image name: MSHTML.dll

Timestamp:        ThuJun 19 08:14:41 2014 (53A22B71)

CheckSum:        010838FF

ImageSize:       01083000

File version:     11.0.9600.17207

Product version:  11.0.9600.17207

File flags:       0 (Mask3F)

File OS:         40004 NT Win32

File type:        2.0 Dll

File date:       00000000.00000000

Translations:     0409.04b0

CompanyName:      MicrosoftCorporation

ProductName:      InternetExplorer

InternalName:     MSHTML

OriginalFilename:MSHTML.DLL

ProductVersion:   11.00.9600.17207

FileVersion:      11.00.9600.17207(winblue_gdr_escrow.140618-1157)

FileDescription:  Microsoft (R) HTML Viewer

LegalCopyright:   © Microsoft Corporation. Allrights reserved.

0:040> !address63d70000

Usage:                 Image

Allocation Base:       63d70000

Base Address:           63d70000

End Address:           63d71000

Region Size:           00001000

Type:                  01000000  MEM_IMAGE

State:                 00001000   MEM_COMMIT

Protect:               00000040   PAGE_EXECUTE_READWRITE

More info:             lmv m MSHTML

More info:             !lmi MSHTML

More info:             ln 0x63d70000

问题很明显吧!

有源代码,修改也很容易啦,一句代码的事情,把它的原始属性通过VirtualProtect恢复即可。

修改完之后,大家可以再调试看看,是不是属性变成了PAGE_READONLY,留给大家去尝试吧。

参考文档

[1] Detours http://research.microsoft.com/en-us/projects/detours/

Detours修改段属性漏洞的更多相关文章

  1. Detours改动段属性漏洞

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  2. 通过修改VAD属性破除锁页机制

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 技术学习来源:火哥(QQ:471194425) 注释:因为自己的知 ...

  3. oracle 创建表、删除表、添加字段、删除字段、表备注、字段备注、修改表属性

    1.创建表 create table 表名( classid number() primary key, 表字段 数据类型 是否允许为空(not null:不为空/null:允许空) 默认值(defa ...

  4. 自己动手丰衣足食之轮播图一动态修改marginTop属性实现轮播图

    引言 学习jQuery有年头了,刚开始学习时自己动手写过轮播图,放的久了以至于忘了大致思路了.现在转而做前端,抽空把jquery轮播图拿出来写一写,把各种思路都自己练习练习,这里主要使用动态修改mar ...

  5. jQuery修改class属性和CSS样式

    jQuery修改class属性和CSS样式 class属性修改 类属性即class属性,规定类名. 用类选择器规定样式的时候,需要为元素指定类名,即class属性的值. 注意每个HTML元素只有一个c ...

  6. 关于Entity Framework采用DB First模式创建后的实体批量修改相关属性技巧

    Entity Framework采用DB First模式创建实体是比较容易与方便的,修改已创建的实体在个数不多的情况下也是没问题的,但如果已创建的实体比较多,比如10个实体以上,涉及修改的地方比较多的 ...

  7. [Effective JavaScript 笔记]第32条:始终不要修改__proto__属性

    __proto__属性很特殊,它提供了Object.getPrototypeOf方法所不具备的额外能力,即修改对象原型链接的能力. 避免修改__proto__属性的最明显的原因是可移植性的问题.并不是 ...

  8. ArcMap10.1修改要素属性字段

    ArcMap10.1修改要素属性字段 问题描述:在ArcMap10.1中编辑要素属性表时,遇到输入字段值的长度超过字段最大长度时,ArcMap会抛出“基础DBMS错误[ORA-12899:value ...

  9. 如何在Sql2008中获取表字段属性和注释?

    如何在Sql2008中获取表字段属性和注释? select b.[value] from sys.columns a left join sys.extended_properties b on a. ...

随机推荐

  1. 【伯乐在线】Java线程面试题 Top 50

    本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特 ...

  2. collection 中对类排序

    首先 写出 一个person类 让他继承Comparable 构造函数和get/set不用说 我们要覆盖父类中的comparto方法 代码如下 省略get/set package a; public ...

  3. 给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数。

    给定一个数列a1,a2,a3,...,an和m个三元组表示的查询,对于每个查询(i,j,k),输出ai,ai+1,...,aj的升序排列中第k个数. #include <iostream> ...

  4. 安卓6.0新特性在Fragment申请运行时权限

    今天在Fragment申请权限时代码如下: public void getContacts(){ int flag = ActivityCompat.checkSelfPermission(getAc ...

  5. IT女孩特不烦恼---九月实习总结

    对着岁月落笔,画出一场清风,那是最真的笑容 一溜烟的功夫,小编来实习Android已经四个月了,从刚开始的电商项目到现在的车段子项目,小编渐渐对这个曾经陌生的名字慢慢扭转变成熟悉的面孔,四个月的时间, ...

  6. Android的ProgressBar进度条-android学习之旅(三十一)

    ProgressBar 简介 ProgressBar是一种很常用的Ui,用于给复杂的操作显示进度,提供更好的用户相应.使用setProgress()incrementProgressBy()来设置进度 ...

  7. 【Unity技巧】调整画质(贴图)质量

    写在前面 当我们在Unity中,使用图片进行2D显示时,会发现显示出来的画面有明显的模糊或者锯齿,但是美术给的原图却十分清晰. 要改善这一状况实际上很简单. 造成这样的原因,是Unity在导入图片(或 ...

  8. JAVA内部类_2

    (d)匿名内部类 如果只创建这个类的第一个对象,就无需命名. 由于构造器的名字必须与类名相同,而匿名类没有类名,所以匿名类没有构造器. 取而代之的是将构造器参数传递给超类构造器. 在内部类实现接口的时 ...

  9. javascript之BOM编程Screen(屏幕)对象

    这个对象属性相对比较简单.掌握四个方法即可. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...

  10. Leetcode_118_Pascal's Triangle

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41827325 Given numRows, generat ...