内核破绽发掘手艺系列(3)——bochspwn-reloaded(2) | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)

申博_安全防护 申博 142次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

媒介

在上一局部的文章中我们基于论文解说了信息走漏破绽和bochspwn-reloaded的设想,这一局部解说bochspwn-reloaded的代码和信息走漏破绽的别的发掘要领。

bochspwn-reloaded代码剖析

下面我们来引见bochspwn-reloaded的代码完成。起首来看一下代码的团体架构。bochspwn-reloaded/third_party/instrumentation目次和bochspwn-reloaded/instrumentation目次下都有四个文件夹:linux-x86,windows-x64,windows-x86和windows-x86-markers。bochspwn-reloaded/configs目次下也有对应的四个配置文件:config-linux-x86.txt,config-windows-x64.txt,config-windows-x86.txt和config-windows-x86-markers.txt。

  • linux-x86:32位linux体系内核信息走漏破绽检测
  • windows-x86:32位windows体系内核信息走漏破绽检测
  • windows-x64:64位windows体系内核信息走漏破绽检测
  • windows-x86-markers:检测内核内存中文件体系或收集等的走漏

这里剖析linux-x86/windows-x86/windows-x64这三个文件夹下的代码。若是我们要检测32位linux体系内核信息走漏破绽,就需要拷贝bochspwn-reloaded/third_party/instrumentation目次和bochspwn-reloaded/instrumentation目次下的linux-x86文件夹中的内容到bochs-2.6.9/instrument中并编译,同时运用config-linux-x86.txt配置文件。
在bochspwn-reloaded/third_party/instrumentation目次下的文件夹都含有mem_interface.h和mem_interface.cc两个文件,它们供应read_lin_mem和write_lin_mem两个函数。从指定的虚拟地点读取或许写入数据。
在bochspwn-reloaded/instrumentation目次下的文件夹基础都含有下面这些文件:

  • breakpoints.cc\h:断点功用,由一个unordered_map治理(不是真正意义上的断点,是上一局部说的hook)。这局部代码基础都一样
  • common.cc\h:供应一些通用函数
  • instrument.cc\h:插桩功用
    基础上完成了下面这些插桩函数。

bx_instr_initialize\bx_instr_exit

离别完成初始化和清算。

bx_instr_interrupt

在发明破绽以后若是设置了此时中缀会挪用invoke_guest_int3函数。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
在invoke_guest_int3函数中生存以后地点中的值,然后向以后地点写入0xcc。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
bx_instr_interrupt发作中缀时将本来的值写入中缀地点,设置全局符号。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)

bx_instr_before_execution

linux-x86

若是是push指令,搜检是不是是内存分派或开释相干函数的开首。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
关于kmalloc和vmalloc函数,生存size和flags参数。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
关于kfree,vfree和kmem_cache_free函数,消灭污点。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
关于kmem_cache_create函数,生存cache的size和组织函数指针。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
关于kmem_cache_alloc函数,生存cache,size和flags参数。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
关于kmem_cache_destroy函数,从内部结构中移除cache和cache的组织函数上的断点。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
关于动态cache组织函数,符号污点(动态cache组织函数的地点是kmem_cache_create函数末端时取得的,见下文)。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
若是是ret指令,搜检是不是是内存分派相干函数的末端。关于kmem_cache_create函数,若是函数实行胜利,生存新创建的缓存的地点并在组织函数上设置一个断点。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
关于别的的内存分派函数符号污点。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
若是是内存拷贝指令,符号rep_movs符号为true;若是是转变内核栈的指令,符号esp_change符号为true并记录下ESP;若是是我们增加的prefetcht1和prefetcht1指令,关于prefetcht1指令将以后的ESP值记录到一个unordered_set中,关于prefetcht2指令将以后的ESP值从unordered_set中删除。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)

windows-x86

相似而且越发简朴,因为只需要处置惩罚ExAllocatePoolWithTag函数的状况。

windows-x64

婚配上了配置文件中的memcpy_signature就挪用handle_memcpy函数。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
memcpy被编译为内联的mov指令序列的状况也挪用handle_memcpy函数。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
在handle_memcpy函数中,若是源地点和目标地点都是内核地点则举行污点流传;若是只需目标地点是内核地点申明是用户态向内核态写,消灭污点;若是只需源地点是内核地点申明是内核态向用户态写,搜检污点符号,若是一切的字节都和符号字节分歧则消灭污点,若是发明有未初始化的字节则进入破绽申报逻辑。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
符号内核栈是不是发作转变。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
池污点符号。碰到push指令若是是内存分派函数开首读取origin和size,存储在RSP作为key的hashmap中。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
碰到ret指令若是是内存分派函数末端从RAX寄存器中读取base address,因为RSP寄存器的值在进入和退出一个函数时稳定,以是找到之前存储的origin和size,依据这些信息做污点符号。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)

bx_instr_wrmsr

只需windows-x64顶用到了这个插桩函数。在config-windows-x64.txt中设置了pool_alloc_prologues和pool_alloc_epilogues的地点。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
当写入的地点是MSR_LSTAR寄存器时代表体系挪用,计算出内核基址,据此修正并设置pool_alloc_prologues和pool_alloc_epilogues。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)

large bin的一个破绽

前导知识 malloc_chunk 的结构 /*
This struct declaration is misleading (but accurate and necessary).
It declares a “view” into memory allowing access to necessary
fields at known offsets from a given base. See explanation below.
*/
struct malloc_chunk {

INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */

struct malloc_chunk* fd;

bx_instr_after_execution

linux-x86

栈污点符号。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)

windows-x64

和linux-x86相似。

windows-x86

也和linux-x86相似,不外要处置惩罚xchg eax, esp和__SEH_prolog4/__SEH_prolog4_GS的特别状况。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)

bx_instr_lin_access

linux-x86

若是在实行内存拷贝指令,拷贝的源地点和目标地点最少要有一个是内核态地点。接下来的逻辑和windows-x64中handle_memcpy函数的逻辑差不多。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
若是是用户态向内核态写则符号为已初始化。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
若是是在两个内核态地点之间则举行污点流传。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
若是是内核态向用户态写而且存在未初始化的字节就申报可以或许存在的破绽,若是一切的字节都和符号字节分歧从新符号已初始化。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
若是不是在实行内存拷贝指令,处置惩罚流程也和前面相似。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
末了进入申报破绽的代码。

windows-x86

和linux-x86相似。

windows-x64

内存在每次被任何不属于memcpy操纵的指令掩盖时消灭污点。
内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)

  • os_x.cc\h:一些特定于操纵体系的功用
  • symbols.cc\h:windows操纵体系上对日记信息符号化
  • taint.cc\h:污点功用
    在windows-x64中的taint.cc中的initialize函数中包罗上一局部的文章中提到的运用非常分派机制完成的Memory overcommitment功用。
    内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
    内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)

别的未初始化破绽发掘要领

静态剖析

关于linux可以或许举行源代码剖析,关于windows可以或许举行二进制剖析。开辟发掘未初始化破绽的源代码剖析的东西可以或许会简朴一点,然则开辟发掘未初始化破绽的二进制剖析的东西可以或许难度就对照大了。

代码审计

关于linux可以或许查找一切挪用copy_to_user的函数举行审计,关于windows可以或许查找ProbeForWrite函数的上下文。研究人员经由过程这类体式格局找到了windows内核中的两个未初始化破绽。

分歧内核版本对照

因为微软关于win 7如许对照老的操纵体系打补丁不是很主动,以是若是win10上有memset而win7雷同的处所没有,可以或许就是在win10默默修了个未初始化破绽。研究人员经由过程这类体式格局也找到了影响老版本windows内核的两个未初始化破绽。

举行两次体系挪用

这个要领就是说若是每块新分派内存中的字节都跟着时候转变,那末用户态顺序可以或许剖析两次体系挪用的输出,寻觅不相等但大众偏移量雷同的字节。存在如许的字节申明可以或许存在信息走漏破绽。研究人员对windows操纵体系含有NtQuery前缀的函数举行了这类fuzz,发明了多个破绽。

没有污点追踪的相似bochspwn的插桩

和bochspwn-reloaded相似的全体系插桩应当可以或许在没有污点追踪的状况下检测未初始化内存形成的信息走漏,只需它可以或许搜检一切源自内核的用户态内存写。一种要领就是剖析体系挪用的输出,搜刮像内核地点如许不该当在个中涌现的信息。或许可以或许给每块新分派内存中符号特别字节,在内核态写入到用户态的数据中查找这些特别字节。冰刃实验室的digtool大抵就是如许的道理,也和Project Zero撞了许多洞,有兴致可以或许看一下他们的论文。

C++逆向学习(二) vector

现在的逆向C++题越来越多,经常上来就是一堆容器、标准模板库,这个系列主要记录这些方面的逆向学习心得 本文主要介绍std::vector,因为逆向题中的C++代码可能会故意写的很绕,比如输入一个数组,直接给vector赋值即可,但是也可以用稍微费解的方法连续push_back(),也算是一种混淆的手段,文章中的示例会逆向一些故意写的繁琐的程序 vector 内存布局 仍然用vs调试,观察内存布局 vector a的第一个字段是size 大小第二个字段是capacity 容量 和std::string差不多 当size>capacit


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明内核破绽发掘手艺系列(3)——bochspwn-reloaded(2)
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址