加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 安全 > 正文

借助Intel PT与IPTAnalyzer进行漏洞利用

发布时间:2022-07-11 15:33:34 所属栏目:安全 来源:互联网
导读:英特尔PT(处理器跟踪)是一项最新的英特尔CPU的技术,Intel Skylake和更高版本的CPU型号都已经具有了此功能。你可以使用触发和过滤功能在指令级别跟踪代码执行。通过本文,我们希望探索该技术在漏洞利用分析中的实际应用。 0x01 在Windows上使用Intel PT 在
  英特尔PT(处理器跟踪)是一项最新的英特尔CPU的技术,Intel Skylake和更高版本的CPU型号都已经具有了此功能。你可以使用触发和过滤功能在指令级别跟踪代码执行。通过本文,我们希望探索该技术在漏洞利用分析中的实际应用。
 
  0x01 在Windows上使用Intel PT
 
  在Windows上记录Intel PT的信息主要可以使用三种方法。
 
  复制
  [WindowsIntelPT](https://github.com/intelpt/WindowsIntelPT)
  [WinIPT](https://github.com/ionescu007/winipt)
  [Intel® Debug Extensions for WinDbg* for Intel® Processor Trace](https://software.intel.com/en-us/intel-system-studio-2019-windbg-pt-user-guide-windows-introducing-the-intel-debug-extensions-for-windbg-for-intel-processor-trace)
 
  记录压缩
 
  在现实世界中使用Intel PT的一个障碍是处理Intel PT跟踪文件所需的大量CPU时间,跟踪文件已被压缩,在使用之前都需要先对其进行解压缩,Libipt库可用于解码过程,但它更多是单线程操作。
 
  方法
 
  类似于LBR,英特尔PT通过记录分支来工作。在运行时,当CPU遇到任何分支指令(如“ je”,“ call”,“ ret”)时,它将记录对该分支采取的操作。使用附加跳转指令,它将使用1位记录已占用(T)或未占用(NT)。通过间接调用和跳转,它将记录目标地址。对于无条件分支(如跳转或调用),它不会记录更改,因为你可以从指令中推断出目标跳转地址。将使用FUP,TIP,TIP.PGE或TIP.PGD数据包之一将要记录的IP(指令指针)与上次IP记录进行比较。如果地址字节的高位部分重叠,则那些匹配的字节将在当前数据包中被解析。同样,对于临近返回指令,如果返回目标是调用指令的下一条指令,
 
  数据包
 
  IPT压缩中使用的数据包的说明可以从《英特尔®64和IA-32体系结构软件开发人员手册》中找到。
 
  复制
  https://software.intel.com/en-us/articles/intel-sdm
  1.
  有许多数据包用于实现记录机制,但是,很少有重要的数据包类型起主要作用。
 
  PSB数据包
 
  PSB数据包用作跟踪数据包解码的同步点。它是跟踪日志中的边界,在其中可以独立执行减压过程而没有任何副作用,此偏移在libipt库代码中称为“同步偏移”,因为这是跟踪文件中的偏移,你可以在其中安全地开始解码以下数据包。
 
   000000000000001c  psb
  000000000000002c  pad
  000000000000002d  pad
  000000000000002e  pad
  1.
  2.
  3.
  4.
  在偏移量3db处,有一个tip.pge数据包。这意味着指令指针位于数据包指示的位置00007ffbb7d63470。
 
  复制
  ...
  00000000000003db  tip.pge    3: 00007ffbb7d63470
  00000000000003e2  pad
  00000000000003e3  pad
  1.
  2.
  3.
  4.
  从过程映像中,我们可以确定tip.pge的地址00007ffbb7d63470指向以下说明。
 
  复制
  seg000:00007FFBB7D63470                 mov     rcx, [rsp+20h]
  seg000:00007FFBB7D63475                 mov     edx, [rsp+28h]
  seg000:00007FFBB7D63479                 mov     r8d, [rsp+2Ch]
  seg000:00007FFBB7D6347E                 mov     rax, gs:60h
  seg000:00007FFBB7D63487                 mov     r9, [rax+58h]
  seg000:00007FFBB7D6348B                 mov     rax, [r9+r8*8]
  seg000:00007FFBB7D6348F                 call    sub_7FFBB7D63310
  1.
  2.
  3.
  4.
  5.
  6.
  7.
  提示数据包指示该代码从地址00007ffbb7d63470开始执行,并继续执行直到遇到00007FFBB7D6348F处的调用指令为止。由于调用不是间接调用,因此调用目标是在编译时预先确定的,因此该tip.pge数据包扩展为内部调用指令,来自调用目标地址00007FFBB7D63310的其他指令将被解码。
 
   8.
  此时,在地址00007FFBB7D63332处发生了间接调用,下一个提示包将在此调用跳转的位置提供必要的信息。压缩会删除地址的前4个字节以节省空间,从3ee的数据包中,我们可以得出调用目标是00007ffbb7d4fb70。
 
  复制
  ...
  00000000000003ee  tip        2: ????????b7d4fb70
  00000000000003f3  pad
  ...
  1.
  2.
  3.
  4.
  解码从00007ffbb7d4fb70继续,直到它在00007FFBB7D4FB8C处有条件跳转指令为止。
 
  复制
  seg000:00007FFBB7D4FB70                 mov     rdx, cs:7FFBB7E38380h
  seg000:00007FFBB7D4FB77                 mov     rax, rcx
  seg000:00007FFBB7D4FB7A                 shr     rax, 9
  seg000:00007FFBB7D4FB7E                 mov     rdx, [rdx+rax*8]
  seg000:00007FFBB7D4FB82                 mov     rax, rcx
  seg000:00007FFBB7D4FB85                 shr     rax, 3
  seg000:00007FFBB7D4FB89                 test    cl, 0Fh
  seg000:00007FFBB7D4FB8C                 jnz     short loc_7FFBB7D4FB95
  seg000:00007FFBB7D4FB8E                 bt      rdx, rax
  seg000:00007FFBB7D4FB92                 jnb     short loc_7FFBB7D4FBA0
  seg000:00007FFBB7D4FB94                 retn
  
  此时,tnt数据包将为你提供是否执行条件跳转的信息。以下带有2个“ ..”的tnt.8数据包表示,它没有进行两次无条件跳转。
 
  复制
  00000000000003fe  tnt.8      ..
  1.
  接下来,它将在00007FFBB7D4FB94处遇到ret指令。
 
  复制
  seg000:00007FFBB7D4FB94                 retn
  1.
  即使可以通过某种模拟进行计算,也无法从image本身可靠地确定返回地址,“ ret”是间接跳转,它从当前SP(堆栈指针)中检索跳转地址,下一个提示包将为你提供此ret指令返回的地址。
 
  复制
  00000000000003ff  tip        2: ????????b7d63334
  1.
  返回的地址将按照以下方式反汇编,并且代码执行将继续。
 
  复制
  seg000:00007FFBB7D63334                 mov     rax, rcx
  seg000:00007FFBB7D63337                 mov     rcx, [rsp+48h+var_28]
  seg000:00007FFBB7D6333C                 mov     rdx, [rsp+48h+var_20]
  seg000:00007FFBB7D63341                 mov     r8, [rsp+48h+var_18]
  seg000:00007FFBB7D63346                 mov     r9, [rsp+48h+var_10]
  seg000:00007FFBB7D6334B                 add     rsp, 48h
  1.
  2.
  3.
  4.
  5.
  6.
  IPTA 分析工具
 
  IPT压缩机制非常有效,需要拆卸引擎的帮助来重建完整指令。即使是很短的IPT跟踪记录,也需要大量CPU资源进行解压缩。一种方法是,可以应用IP过滤来限制输出,以最大程度地减少跟踪输出量。有时出于研究目的,不可避免的需要处理大量跟踪日志。
 
  IPTAnalyzer是用于并行处理IPT跟踪日志的工具。该工具可以使用Python多处理库处理Intel PT跟踪,并创建基本的块缓存文件,该块信息对于控制流变化的整体分析很有用。例如,如果要从特定的image或地址范围收集指令,则可以在检索完整的指令之前查询此基本块缓存文件以查找属于该范围的位置。
 
  复制
  https://github.com/ohjeongwook/iptanalyzer
  1.
  案例研究:CVE-2017-11882
 
  CVE-2017-11882是Microsoft Office公式编辑器中的漏洞,这是练习将IPT用于漏洞分析的良好练习目标。我们将说明如何使用IPT和IPTAnalyzer高效执行漏洞利用分析。
 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读