国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

記一次 .NET某股票交易軟件 靈異崩潰分析

這篇具有很好參考價(jià)值的文章主要介紹了記一次 .NET某股票交易軟件 靈異崩潰分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一:背景

1. 講故事

在dump分析的旅程中也會(huì)碰到一些讓我無(wú)法解釋的靈異現(xiàn)象,追過這個(gè)系列的朋友應(yīng)該知道,上一篇我聊過 宇宙射線 導(dǎo)致的程序崩潰,后來(lái)我又發(fā)現(xiàn)了一例,而這一例恰恰是高鐵的 列控連鎖一體化 程序,所以更加讓我確定這是由于 電離輻射 干擾了計(jì)算機(jī)的 數(shù)字信號(hào) 導(dǎo)致程序的bit翻轉(zhuǎn),而這一篇也是一個(gè)我認(rèn)為的 靈異現(xiàn)象,拿出來(lái)給朋友們分享一下。

前段時(shí)間有位朋友找到我,說他的程序會(huì)偶發(fā)性崩潰,一直找不到原因很糾結(jié),看我在這一塊非常有經(jīng)驗(yàn)讓我?guī)兔匆幌略趺椿厥?,既然是有備而?lái)自然dump也準(zhǔn)備好了,接下來(lái)開始分析之旅吧。

二:WinDbg 分析

1. 為什么會(huì)崩潰

要想分析崩潰的原因還得windbg自帶的自動(dòng)化分析命令 !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,淺層意思就是: 安全檢查失敗或緩沖區(qū)溢出,行話就是:棧上的cookie遭到了破壞。

可能有些朋友對(duì) cookie 不是很了解,這個(gè)cookie非web的cookie,而是在方法棧上藏的一個(gè)隨時(shí)值,在方法的退出前會(huì)檢查這個(gè)值有沒有被破壞,目的就是防止有人無(wú)意或者惡意攻擊線程棧,如果遭到破壞,會(huì)觸發(fā) int 29nt!KiRaiseSecurityCheckFailure 函數(shù)讓程序快速硬性崩潰。

如果有些朋友不明白,畫個(gè)圖如下:

記一次 .NET某股票交易軟件 靈異崩潰分析

2. cookie 被破壞了嗎

既然說 cookie 被破壞了,說明有棧溢出的情況,那到底溢出了什么東西呢?這需要分析崩潰處附近的匯編代碼才能知道,接下來(lái)使用 .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 函數(shù)退出階段時(shí)檢查 cookie 被破壞了,繼而程序快速崩潰,接下來(lái)需要反編譯 RtlAllocateLUnicodeString 函數(shù),簡(jiǎn)化后如下:


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

這個(gè)是 cookie 種子,可以用 dp 給撈出來(lái),即下面的 0000d9998c879750 。


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

  1. xor rax,rsp

將 cookie 種子和當(dāng)前方法的棧頂指針rsp異或一下,目的就是做一個(gè)和棧幀相關(guān)的隨機(jī)值,當(dāng)前的rsp即k上的000000341547b3b0 ,用 windbg 計(jì)算之后為:


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

  1. qword ptr [rbp-8],rax

將異或后的 安全值 塞到 rbp-8 的棧位置,這里的 rbp 由上面的匯編語(yǔ)句 mov rbp,rsp 賦值的,因?yàn)樯厦嬗腥齻€(gè)push加一個(gè)call,所以rbp應(yīng)該退掉4個(gè)0x8,最后計(jì)算的結(jié)果為棧位置000000341547b3f8 存的就是安全值,下面的輸出也可以確認(rèn)。


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

在方法退出時(shí)需要通過 _security_check_cookie 方法來(lái)檢查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)

經(jīng)過 windbg 計(jì)算 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

接下來(lái)拿著 rcx= 0000d9998c879750 去反匯編下 _security_check_cookie 函數(shù),簡(jiǎn)化后如下:


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

代碼邏輯非常簡(jiǎn)單,還原成 C 大概如下:


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

從C的邏輯看我們的 stackcookie=0000d9998c879750 完全滿足 if 條件,但不知道為什么會(huì)走到這個(gè) else 里面去,無(wú)法想象。。。所以定性為 靈異事件?。?!

4. 故事后續(xù)

把所有的值都推算完了之后,在不可能走到 else 的情況下還是走到了 else,這個(gè)真的很讓人無(wú)語(yǔ)+費(fèi)解,過了幾天找朋友確認(rèn)的時(shí)候,朋友又反饋了一個(gè)信息,說電腦上的其他程序也會(huì)遇到這種情況,讓客戶重裝操作系統(tǒng),目前還沒遇到問題。

所以我覺得這個(gè)問題可能是 操作系統(tǒng)層面 的問題,或者是 硬件層面 的問題,而且程序的異常是在 clr 層面,用戶代碼是無(wú)法干涉的,程序中也沒有做 Pinvoke。

三:總結(jié)

一個(gè)是輻射導(dǎo)致的bit位翻轉(zhuǎn),一個(gè)是不可能走到else的地方走了else,各個(gè)奇奇怪怪的事情,讓我的高級(jí)調(diào)試之旅豐富多彩,大家覺得這個(gè)崩潰還有其他的可能性嗎?期待大家的留言。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-760623.html

記一次 .NET某股票交易軟件 靈異崩潰分析

到了這里,關(guān)于記一次 .NET某股票交易軟件 靈異崩潰分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 記一次 .NET 某埋線管理系統(tǒng) 崩潰分析

    記一次 .NET 某埋線管理系統(tǒng) 崩潰分析

    經(jīng)常有朋友跟我反饋,說看你的文章就像看天書一樣,有沒有一些簡(jiǎn)單入手的dump 讓我們先找找感覺,哈哈,今天就給大家?guī)?lái)一篇入門級(jí)的案例,這里的入門是從 WinDbg 的角度來(lái)闡述的,這個(gè)問題如果你通過 記日志,分析代碼 的方式,可能真的無(wú)法解決,不信的話繼續(xù)往下

    2024年02月11日
    瀏覽(23)
  • 記一次 .NET某爐膛鍋爐檢測(cè)系統(tǒng) 崩潰分析

    記一次 .NET某爐膛鍋爐檢測(cè)系統(tǒng) 崩潰分析

    上個(gè)月有個(gè)朋友在微信上找到我,說他們的軟件在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我?guī)兔聪略趺椿厥?,確實(shí)工控類的軟件環(huán)境復(fù)雜難搞,朋友手上有一個(gè)崩潰的dump,剛好丟給我來(lái)分析一下。 windbg 有一個(gè)厲害之處在于雙擊之后可以幫你自動(dòng)定位到崩

    2024年04月17日
    瀏覽(34)
  • 記一次 .NET 某旅行社審批系統(tǒng) 崩潰分析

    記一次 .NET 某旅行社審批系統(tǒng) 崩潰分析

    前些天有位朋友找到我,說他的程序跑著跑著就崩潰了,讓我看下怎么回事,其實(shí)沒怎么回事,抓它的 crash dump 就好,具體怎么抓也是被問到的一個(gè)高頻問題,這里再補(bǔ)一下鏈接: [.NET程序崩潰了怎么抓 Dump ? 我總結(jié)了三種方案] https://www.cnblogs.com/huangxincheng/p/14811953.html ,采用

    2024年02月09日
    瀏覽(21)
  • 記一次 .NET某新能源檢測(cè)系統(tǒng) 崩潰分析

    記一次 .NET某新能源檢測(cè)系統(tǒng) 崩潰分析

    前幾天有位朋友微信上找到我,說他的程序會(huì)偶發(fā)性崩潰,一直找不到原因,讓我?guī)兔匆幌略趺椿厥?,?duì)于這種崩潰類的程序,最好的辦法就是丟dump過來(lái)看一下便知,話不多說,上windbg說話。 對(duì)于一個(gè)崩潰類的dump,尋找崩潰點(diǎn)非常重要,常用的命令就是 !analyze -v ,輸出如

    2024年02月08日
    瀏覽(26)
  • 記一次 .NET某工控 宇宙射線 導(dǎo)致程序崩潰分析

    記一次 .NET某工控 宇宙射線 導(dǎo)致程序崩潰分析

    為什么要提 宇宙射線 , 太陽(yáng)耀斑 導(dǎo)致的程序崩潰呢?主要是昨天在知乎上看了這篇文章:莫非我遇到了傳說中的bug? ,由于 rip 中的0x41變成了0x61出現(xiàn)了bit位翻轉(zhuǎn)導(dǎo)致程序崩潰,截圖如下: 下面的評(píng)論大多是說由于 宇宙射線 ,這個(gè)太玄乎了,說實(shí)話看到這個(gè) 傳說bug 的提法

    2024年02月04日
    瀏覽(29)
  • 記一次 .NET 某新能源材料檢測(cè)系統(tǒng) 崩潰分析

    記一次 .NET 某新能源材料檢測(cè)系統(tǒng) 崩潰分析

    上周有位朋友找到我,說他的程序經(jīng)常會(huì)偶發(fā)性崩潰,一直沒找到原因,自己也抓了dump 也沒分析出個(gè)所以然,讓我?guī)兔聪略趺椿厥?,那既然?dump,那就開始分析唄。 一直跟蹤我這個(gè)系列的朋友應(yīng)該知道分析崩潰第一個(gè)命令就是 !analyze -v ,讓windbg幫我們自動(dòng)化異常分析。

    2024年02月05日
    瀏覽(19)
  • 記一次 .NET 某醫(yī)院門診軟件 卡死分析

    記一次 .NET 某醫(yī)院門診軟件 卡死分析

    前幾天有位朋友找到我,說他們的軟件在客戶那邊卡死了,讓我?guī)兔聪率窃趺椿厥拢课揖妥屌笥言诔绦蚩ㄋ赖臅r(shí)候通過 任務(wù)管理器 抓一個(gè) dump 下來(lái),雖然默認(rèn)抓的是 wow64 ,不過用 soswow64.dll 轉(zhuǎn)還是可以的,參考命令如下: 接下來(lái)就可以分析了哈。 首先用 !t 簡(jiǎn)單看一下主

    2024年02月04日
    瀏覽(19)
  • 記一次 .NET某賬本軟件 非托管泄露分析

    記一次 .NET某賬本軟件 非托管泄露分析

    中秋國(guó)慶長(zhǎng)假結(jié)束,哈哈,在老家拍了很多的短視頻,有興趣的可以上B站觀看:https://space.bilibili.com/409524162 ,今天繼續(xù)給大家分享各種奇奇怪怪的.NET生產(chǎn)事故,希望能幫助大家在未來(lái)的編程之路上少踩坑。 話不多說,這篇看一個(gè) .NET程序集泄露 導(dǎo)致的CLR私有堆泄露的案例,

    2024年02月08日
    瀏覽(25)
  • 記一次 .NET某收銀軟件 非托管泄露分析

    記一次 .NET某收銀軟件 非托管泄露分析

    在我的分析之旅中,遇到過很多程序的故障和殺毒軟件扯上了關(guān)系,有殺毒軟件導(dǎo)致的程序卡死,有殺毒軟件導(dǎo)致的程序崩潰,這一篇又出現(xiàn)了一個(gè)殺毒軟件導(dǎo)致的程序非托管內(nèi)存泄露,真的是分析多了什么鬼都能撞上。 前幾天有位朋友找到過,我他們的程序內(nèi)存在慢慢的泄

    2024年02月03日
    瀏覽(25)
  • 記一次 .NET 某拍攝監(jiān)控軟件 卡死分析

    記一次 .NET 某拍攝監(jiān)控軟件 卡死分析

    今天本來(lái)想寫一篇 非托管泄露 的生產(chǎn)事故分析,但想著昨天就上了一篇非托管文章,連著寫也沒什么意思,換個(gè)口味吧,剛好前些天有位朋友也找到我,說他們的拍攝監(jiān)控軟件卡死了,讓我?guī)兔Ψ治鱿聻槭裁磿?huì)卡死,聽到這種軟件,讓我不禁想起了前些天 在程序員桌子上安

    2024年02月08日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包