记一次 .NET某股票交易软件 灵异崩溃分析

news2024/11/20 20:35:44

一:背景

1. 讲故事

在dump分析的旅程中也会碰到一些让我无法解释的灵异现象,追过这个系列的朋友应该知道,上一篇我聊过 宇宙射线 导致的程序崩溃,后来我又发现了一例,而这一例恰恰是高铁的 列控连锁一体化 程序,所以更加让我确定这是由于 电离辐射 干扰了计算机的 数字信号 导致程序的bit翻转,而这一篇也是一个我认为的 灵异现象,拿出来给朋友们分享一下。

前段时间有位朋友找到我,说他的程序会偶发性崩溃,一直找不到原因很纠结,看我在这一块非常有经验让我帮忙看一下怎么回事,既然是有备而来自然dump也准备好了,接下来开始分析之旅吧。

二:WinDbg 分析

1. 为什么会崩溃

要想分析崩溃的原因还得windbg自带的自动化分析命令 !analyze -v ,输出如下:


0:117> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

CONTEXT:  (.ecxr)
rax=0000000000000001 rbx=0000000000000000 rcx=0000000000000002
rdx=000000000005001b rsi=000000000000000e rdi=00000161b1b8c718
rip=00007ffdd0961abd rsp=000000341547b370 rbp=000000341547b250
 r8=0000000000000005  r9=000000000000003d r10=0000000000000000
r11=7007f0b8d350316a r12=0000000000000000 r13=0000000000000003
r14=000000341547b5c0 r15=0000000000000001
iopl=0         nv up ei pl nz na pe nc
cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
clr!_report_gsfailure+0x1d:
00007ffd`d0961abd cd29            int     29h
Resetting default scope

EXCEPTION_RECORD:  (.exr -1)
ExceptionAddress: 00007ffdd0961abd (clr!_report_gsfailure+0x000000000000001d)
   ExceptionCode: c0000409 (Security check failure or stack buffer overrun)
  ExceptionFlags: 00000001
NumberParameters: 1
   Parameter[0]: 0000000000000002
Subcode: 0x2 FAST_FAIL_STACK_COOKIE_CHECK_FAILURE 

SYMBOL_NAME:  clr!_report_gsfailure+1d

...

卦中有一句话叫 Security check failure or stack buffer overrun,浅层意思就是: 安全检查失败或缓冲区溢出,行话就是:栈上的cookie遭到了破坏。

可能有些朋友对 cookie 不是很了解,这个cookie非web的cookie,而是在方法栈上藏的一个随时值,在方法的退出前会检查这个值有没有被破坏,目的就是防止有人无意或者恶意攻击线程栈,如果遭到破坏,会触发 int 29nt!KiRaiseSecurityCheckFailure 函数让程序快速硬性崩溃。

如果有些朋友不明白,画个图如下:

2. cookie 被破坏了吗

既然说 cookie 被破坏了,说明有栈溢出的情况,那到底溢出了什么东西呢?这需要分析崩溃处附近的汇编代码才能知道,接下来使用 .ecxr ; k 3 切到崩溃前的上下文。


0:117> .ecxr ; k 3
rax=0000000000000001 rbx=0000000000000000 rcx=0000000000000002
rdx=000000000005001b rsi=000000000000000e rdi=00000161b1b8c718
rip=00007ffdd0961abd rsp=000000341547b370 rbp=000000341547b250
 r8=0000000000000005  r9=000000000000003d r10=0000000000000000
r11=7007f0b8d350316a r12=0000000000000000 r13=0000000000000003
r14=000000341547b5c0 r15=0000000000000001
iopl=0         nv up ei pl nz na pe nc
cs=0033  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000202
clr!_report_gsfailure+0x1d:
00007ffd`d0961abd cd29            int     29h
 # Child-SP          RetAddr               Call Site
00 00000034`1547b370 00007ffd`d0977900     clr!_report_gsfailure+0x1d
01 00000034`1547b3b0 00007ffd`d097816d     clr!RtlAllocateLUnicodeString+0xe0
02 00000034`1547b420 00007ffd`d09e1d06     clr!RtlDuplicateLUnicodeString+0x8d
...

卦中的信息很丰富,说 clr 在 RtlAllocateLUnicodeString 函数退出阶段时检查 cookie 被破坏了,继而程序快速崩溃,接下来需要反编译 RtlAllocateLUnicodeString 函数,简化后如下:


0:117> uf clr!RtlAllocateLUnicodeString
clr!RtlAllocateLUnicodeString:
00007ffd`d0977820 48895c2418      mov     qword ptr [rsp+18h],rbx
00007ffd`d0977825 55              push    rbp
00007ffd`d0977826 56              push    rsi
00007ffd`d0977827 57              push    rdi
00007ffd`d0977828 488bec          mov     rbp,rsp
00007ffd`d097782b 4883ec50        sub     rsp,50h
00007ffd`d097782f 488b05d2777600  mov     rax,qword ptr [clr!_security_cookie (00007ffd`d10df008)]
00007ffd`d0977836 4833c4          xor     rax,rsp
00007ffd`d0977839 488945f8        mov     qword ptr [rbp-8],rax
00007ffd`d097783d 488bfa          mov     rdi,rdx
00007ffd`d0977840 488bf1          mov     rsi,rcx
00007ffd`d0977843 c745f0e50000c0  mov     dword ptr [rbp-10h],0C00000E5h
00007ffd`d097784a 33db            xor     ebx,ebx
00007ffd`d097784c 4885d2          test    rdx,rdx
00007ffd`d097784f 745f            je      clr!RtlAllocateLUnicodeString+0x90 (00007ffd`d09778b0)  Branch
...
00007ffd`d09778f2 8bc3            mov     eax,ebx
00007ffd`d09778f4 488b4df8        mov     rcx,qword ptr [rbp-8]
00007ffd`d09778f8 4833cc          xor     rcx,rsp
00007ffd`d09778fb e820a1feff      call    clr!_security_check_cookie (00007ffd`d0961a20)
00007ffd`d0977900 488b9c2480000000 mov     rbx,qword ptr [rsp+80h]
00007ffd`d0977908 4883c450        add     rsp,50h
00007ffd`d097790c 5f              pop     rdi
00007ffd`d097790d 5e              pop     rsi
00007ffd`d097790e 5d              pop     rbp
00007ffd`d097790f c3              ret

卦中的信息量还是非常大的,我们通读下汇编代码理解下 安全检查 中的一些基本元素以及逻辑是什么? 步骤大概如下:

  1. _security_cookie

这个是 cookie 种子,可以用 dp 给捞出来,即下面的 0000d9998c879750


0:117> dp clr!_security_cookie L1
00007ffd`d10df008  0000d999`8c879750

  1. xor rax,rsp

将 cookie 种子和当前方法的栈顶指针rsp异或一下,目的就是做一个和栈帧相关的随机值,当前的rsp即k上的000000341547b3b0 ,用 windbg 计算之后为:


0:117> ? 00000034`1547b3b0 ^ 0000d999`8c879750
Evaluate expression: 239339632076000 = 0000d9ad`99c024e0

  1. qword ptr [rbp-8],rax

将异或后的 安全值 塞到 rbp-8 的栈位置,这里的 rbp 由上面的汇编语句 mov rbp,rsp 赋值的,因为上面有三个push加一个call,所以rbp应该退掉4个0x8,最后计算的结果为栈位置000000341547b3f8 存的就是安全值,下面的输出也可以确认。


0:117> ? 00000034`1547b420-0x8-0x8-0x8-0x8
Evaluate expression: 223695320064 = 00000034`1547b400

0:117> dp 00000034`1547b400-8 L1
00000034`1547b3f8  0000d9ad`99c024e0

  1. clr!_security_check_cookie

在方法退出时需要通过 _security_check_cookie 方法来检查cookie是否损坏,核心代码为:


clr!RtlAllocateLUnicodeString+0xd2:
00007ffd`d09778f4 488b4df8        mov     rcx,qword ptr [rbp-8]
00007ffd`d09778f8 4833cc          xor     rcx,rsp
00007ffd`d09778fb e820a1feff      call    clr!_security_check_cookie (00007ffd`d0961a20)

经过 windbg 计算 rcx=0000d9998c879750 ,即 _security_cookie 值。


0:117> dp 00000034`1547b400-8 L1
00000034`1547b3f8  0000d9ad`99c024e0

0:117> ? 0000d9ad`99c024e0 ^ 00000034`1547b3b0
Evaluate expression: 239253510920016 = 0000d999`8c879750

接下来拿着 rcx= 0000d9998c879750 去反汇编下 _security_check_cookie 函数,简化后如下:


0:117> uf clr!_security_check_cookie
00007ffd`d0961a20 483b0de1d57700  cmp     rcx,qword ptr [clr!_security_cookie (00007ffd`d10df008)]
00007ffd`d0961a27 7510            jne     clr!_security_check_cookie+0x19 (00007ffd`d0961a39) 
00007ffd`d0961a29 48c1c110        rol     rcx,10h
00007ffd`d0961a2d 66f7c1ffff      test    cx,0FFFFh
00007ffd`d0961a32 7501            jne     clr!_security_check_cookie+0x15 (00007ffd`d0961a35) 
00007ffd`d0961a34 c3              ret
00007ffd`d0961a35 48c1c910        ror     rcx,10h
00007ffd`d0961a39 e962000000      jmp     clr!_report_gsfailure (00007ffd`d0961aa0) 
00007ffd`d0961aa0 48894c2408      mov     qword ptr [rsp+8],rcx
00007ffd`d0961aa5 4883ec38        sub     rsp,38h
00007ffd`d0961aa9 b917000000      mov     ecx,17h
00007ffd`d0961aae ff15e4fa5a00    call    qword ptr [clr!_imp_IsProcessorFeaturePresent (00007ffd`d0f11598)]
00007ffd`d0961ab4 85c0            test    eax,eax
00007ffd`d0961ab6 7407            je      clr!_report_gsfailure+0x1f (00007ffd`d0961abf) 
00007ffd`d0961ab8 b902000000      mov     ecx,2
00007ffd`d0961abd cd29            int     29h

代码逻辑非常简单,还原成 C 大概如下:


void __fastcall _security_check_cookie(uintptr_t stackcookie)
{
	if ((stackcookie == __security_cookie) && (stackcookie高四位 == "0000")) {
		return;
	}
	else {
		_report_gsfailure()
	}
}

从C的逻辑看我们的 stackcookie=0000d9998c879750 完全满足 if 条件,但不知道为什么会走到这个 else 里面去,无法想象。。。所以定性为 灵异事件!!!

4. 故事后续

把所有的值都推算完了之后,在不可能走到 else 的情况下还是走到了 else,这个真的很让人无语+费解,过了几天找朋友确认的时候,朋友又反馈了一个信息,说电脑上的其他程序也会遇到这种情况,让客户重装操作系统,目前还没遇到问题。

所以我觉得这个问题可能是 操作系统层面 的问题,或者是 硬件层面 的问题,而且程序的异常是在 clr 层面,用户代码是无法干涉的,程序中也没有做 Pinvoke。

三:总结

一个是辐射导致的bit位翻转,一个是不可能走到else的地方走了else,各个奇奇怪怪的事情,让我的高级调试之旅丰富多彩,大家觉得这个崩溃还有其他的可能性吗?期待大家的留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1358282.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制药厂污废水处理需要哪些设备和工艺要求

制药厂是一种特殊的工业企业,其生产过程中会产生大量的废水,其中含有各种有害物质和化学物质。为了保护环境和人民的身体健康,制药厂需要对污废水进行有效的处理。那么,制药厂污废水处理需要哪些设备和工艺要求呢? 首先…

谈谈自己对于 Spring IoC 的了解

如果你现在需要准备面试,可以关注我的公众号:”Tom聊架构“,回复暗号:”578“,领取一份我整理的50W字面试宝典,可以帮助你提高80%的面试通过率,价值很高!! IoC&#xff0…

与ChatGPT一起完成Python4Delphi在Linux下的使用

我要做的功能很简单,获取各个国家手机号的区号, 如我的手机号8618957901025,能将86获取出来, 谷歌提供了一个phonenumbers库能实现, 我当然没指望它能有Delphi版的, 但是它有Python版的, 那…

Parasoft发布C/C++test 2023.2:为C++开发人员赋能

Parasoft推出了C开发领域的变革性工具——最新版本的C/Ctest 2023.2。这次更新为开发人员提供了一整套新功能、增强功能和合规性工具,从而改革软件开发生命周期。使用Parasoft C/Ctest 2023.2,用户就拥有了一个可以保证他们的C17代码符合MISRA C 2023的解…

论Acrel-2000MG微电网能量管理系统在储能行业的应用-安科瑞 蒋静

一、概述: 在新型电力系统中新能源装机容量逐年提高,但是新能源比如光伏发电、风力发电是不稳定的能源,所以要维持电网稳定,促进新能源发电的消纳,储能将成为至关重要的一环,是分布式光伏、风电等新能源消纳以及电网安…

DS|二叉树

题目一:DS二叉树 -- 二叉树构建与遍历 题目描述: 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘#’表示,例如AB#C##D##),建立该二叉树的二叉链式存储结构&#xf…

【React系列】JSX核心语法和原理

本文来自#React系列教程:https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. ES6 的 class 虽然目前React开发模式中更加流行hooks,但是依然有很多的项目依然是使用类组件&#x…

李沐机器学习系列5---循环神经网络

1 Introduction 对于样本的分析,通过全连接层处理表格数据,通过卷积神经网络处理图像数据;第一种假设,所有数据都是独立同分布的RNN 处理序列信号 序列数据的更多场景 1)用户使用习惯具有时间的先后性 2)外…

【Vm】兆懿,安卓虚拟机

以前用了Win11安卓子系统,体验不好 这次试试兆懿。弄了几个小时,终于安装成功 实际体验极差:虚拟机占用内存多机箱一直呜呜叫个不停;打开软件发现卡到爆炸还时不时闪退 为了不让他占空间,第二天卸载。 虚拟机就是折腾着…

java实现list去重(四种方法)

📑前言 本文主要是【Java】——java实现list去重(四种方法)的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页…

工厂如何确定设备故障的原因?

设备故障是制造业中常见的问题,对生产效率和运营成本产生重大影响。为了解决设备故障并提高生产效率,确定设备故障的准确原因至关重要。本文将介绍一些关键步骤和方法,帮助工厂确定设备故障的原因。 1. 收集和分析数据 要确定设备故障的原因…

互联网加竞赛 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于CNN实现谣言检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&am…

局域网共享打印机设置

一 配置共享打印机环境 方法1(打印机连接的电有设置密码的设置): 1 需要在非直接连接打印机的pc上设置,登录账号,在控制面板中进入凭证管理,添加连接打印机主机的登录凭证 方法2(免账号密码…

【InnoDB数据存储结构】第3章节:区、段、碎片区和表空间

文章目录结构 区、段、碎片区和表空间 什么是区?什么是段?什么是碎片区?什么是表空间? 在上文 InooDB 存储行格式一文中已经大致讲述过,再来回顾一下,直接上图: 名词解释如下: 行…

使用 Parallels Desktop 彻底改变您的开发和测试工作流程

Parallels Desktop 等虚拟机平台已经改变了应用程序开发和测试。 在当今快节奏的技术环境中,开发人员和测试人员现在能够在虚拟沙箱中进行操作,能够使用容器、虚拟机或 Kubernetes 集群快速创建和拆除类似虚拟生产的环境。 无论您是为 Windows 或 Mac …

(03)光刻——半导体电路的绘制

01、绘制精细电路的第一步 金属-氧化物半导体场效应晶体管(MOSFET)的革命,让我们可以在相同面积的晶圆上同时制造出更多晶体管。MOSFET体积越小,单个 MOSFET的耗电量就越少,还可以制造出更多的晶体管,让其发挥作用,可谓是一举多得。可见,制造更小的MOSFET成了关键因素…

第五周:深度学习知识点回顾

前言: 讲真,复习这块我是比较头大的,之前的线代、高数、概率论、西瓜书、樱花书、NG的系列课程、李宏毅李沐等等等等…那可是花了三年学习佳实践下来的,现在一想脑子里就剩下几个名词就觉得废柴一个了,朋友们有没有同感…

SDRAM小项目——SDRAM初始化配置

主要写了SDRAM的初始化模块,注重文档信息的查找,时序图的设计,SDRAM仿真插件的使用。 文档信息: 根据文档说明,SDRAM在使用之前必须先进行初始化 初始化之前要进行100us的延迟,在100us内除了INHIBIT和NOP命…

【数据分析实战】冰雪大世界携程景区评价信息情感分析采集词云

文章目录 引言数据采集数据集展示数据预处理 数据分析评价总体情况分析本人浅薄分析 各游客人群占比分析本人浅薄分析 各评分雷达图本人浅薄分析 差评词云-可视化本人浅薄分析 好评词云-可视化本人浅薄分析 综合分析写在最后 今年冬天,哈尔滨冰雪旅游"杀疯了&q…

炫酷的倒计时引导页

文章目录 文件分布介绍效果预览代码css样式Locationplayer.css js样式player.js 文件分布介绍 效果预览 代码 css样式 Location html {height: 100%;}body {font-family: "Helvetica Neue", "Luxi Sans", "DejaVu Sans", Tahoma, "Hirag…