日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DUMP文件分析4:栈溢出

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DUMP文件分析4:栈溢出 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前面說到過,棧溢出類型的異常通過編程的方式獲取DUMP可能不成功,因為棧溢出會破壞SEH(結構化異常處理)框架。實際上,通過DUMP文件來調試棧溢出同樣是困難的,因為棧溢出本身一般不會造成異常,異常往往發生在棧溢出破壞棧上的數據之后,同時,由于棧溢出破壞了棧上的數據,使得我們無法對函數調用進行回溯,從而難以定位問題的發生位置。?
本節的示例是經dump1簡單修改而來,在Crash Me!按鈕的消息處理函數中,寫下如下代碼:

int a[10];for( int i = 0; i < 200; i++ )a[i] = i;printf("%d\n", a[0]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

需要注意的是,Visual Studio針對棧溢出有保護措施,如果開啟了保護措施,則棧溢出會被檢測出來,例如:?
?
這里我們使用Release編譯,并選擇最大化速度優化代碼,這樣就不會添加棧溢出的檢查代碼。此時,再運行程序:?
?
就檢查不到棧溢出了。同時,我們的MyUnhandledExceptionFilter函數也沒有起作用,沒有生成mini.dmp。因此,我們用任務管理器手動抓取DUMP文件。?
加DUMP文件加載到Windbg中,切換到32位模式,然后使用 !analyze -v進行分析:

WARNING: ole32 overlaps gdi32 *** WARNING: symbols timestamp is wrong 0x569a9398 0x569a8dc2 for ole32.dll *** ERROR: Module load completed but symbols could not be loaded for mfc90.dll *** ERROR: Symbol file could not be found. Defaulted to export symbols for msvcr90.dll - Cannot find frame 0x7c, previous scope unchanged Failed calling InternetOpenUrl, GLE=12029FAULTING_IP: wow64cpu!CpupReturnFromSimulatedCode+0 7476271e 6744 inc espEXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 0000000000000000ExceptionCode: 80000003 (Break instruction exception)ExceptionFlags: 00000000 NumberParameters: 0FAULTING_THREAD: 00000000000014b0DEFAULT_BUCKET_ID: STACKIMMUNEPROCESS_NAME: dump2.exeOVERLAPPED_MODULE: Address regions for 'ole32' and 'gdi32' overlapERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION_CODE: (NTSTATUS) 0x80000003 (2147483651) - {MOD_LIST: <ANALYSIS/>NTGLOBALFLAG: 0APPLICATION_VERIFIER_FLAGS: 0CONTEXT: ffffffffc0000005 -- (.cxr 0xffffffffc0000005) Unable to read context, HRESULT 0x80004002ADDITIONAL_DEBUG_TEXT: Followup set based on attribute [Is_ChosenCrashFollowupThread] from Frame:[0] on thread:[PSEUDO_THREAD]LAST_CONTROL_TRANSFER: from 00000000775b94cf to 000000007752f971PRIMARY_PROBLEM_CLASS: STACKIMMUNEBUGCHECK_STR: APPLICATION_FAULT_STACKIMMUNE_ZEROED_STACKSTACK_TEXT: 00000000`00000000 00000000`00000000 dump2.exe+0x0STACK_COMMAND: .cxr 00000000001AE2D0 ; kb ; ** Pseudo Context ** ; kbSYMBOL_NAME: dump2.exeFOLLOWUP_NAME: MachineOwnerMODULE_NAME: dump2IMAGE_NAME: dump2.exeDEBUG_FLR_IMAGE_TIMESTAMP: 579d6915FAILURE_BUCKET_ID: STACKIMMUNE_80000003_dump2.exe!UnknownBUCKET_ID: X64_APPLICATION_FAULT_STACKIMMUNE_ZEROED_STACK_dump2.exeFOLLOWUP_IP: dump2!__ImageBase+0 003c0000 4d dec ebpWATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/dump2_exe/1_0_0_1/579d6915/unknown/0_0_0_0/bbbbbbb4/80000003/00000000.htm?Retriage=1Followup: MachineOwner ---------
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

沒有得到什么有價值的信息。通過 kb 命令查看一下棧:?
?
異常發生之后的棧還完好,之前的棧被破壞,已經解析不出來符號了。還記得上一節怎么做的嗎?查看地址 0x39f230:?
?
異常代碼是 C0000005,異常地址是 0000000a。實際上,Windbg有專門的指令來解析_EXCEPTION_RECORD結構,即 .exr,如下:?
?
來看看異常發生的地址:?
?
這個地址無法讀取(實際上位于NULL的64KB內)。現在的問題是,是誰讀取了這個地址?是取數據?還是取指令?(實際上.exr指令已經給出了答案)上節說到了函數KiUserExceptionDispatcher,它的一個參數是_EXCEPTION_RECORD結構的指針,另一個參數是CONTEXT結構的指針,也就是如下原型:

VOID NTAPI KiUserExceptionDispatcher( PEXCEPTION_RECORD ExceptionRecord, PCONTEXT Context);
  • 1
  • 2

從棧調用棧中可以找到這個CONTEXT的地址:?
?
來看看這個CONTEXT結構:?
?
其中保存了異常發生時的寄存器上下文。Windbg中有專門解析這個結構的指令 .cxr,我們來看看寄存器的值:?
?
看到EIP的值正是發生非法讀取的地址,因此,可以判斷是讀指令的時候發生的異常。我們來看看棧被破壞的大概范圍,使用的是dds指令,這個指令將地址范圍內的符號進行解析:

0:000:x86> dds 39f568 39ffff 0039f568 0000000b 0039f56c 0000000c 0039f570 0000000d 0039f574 0000000e 0039f578 0000000f 0039f57c 00000010 0039f580 00000011 0039f584 00000012 0039f588 00000013 0039f58c 00000014 0039f590 00000015 0039f594 00000016 0039f598 00000017 0039f59c 00000018 0039f5a0 00000019 0039f5a4 0000001a 0039f5a8 0000001b 0039f5ac 0000001c 0039f5b0 0000001d 0039f5b4 0000001e 0039f5b8 0000001f 0039f5bc 00000020 0039f5c0 00000021 0039f5c4 00000022 0039f5c8 00000023 0039f5cc 00000024 0039f5d0 00000025 0039f5d4 00000026 0039f5d8 00000027 0039f5dc 00000028 0039f5e0 00000029 0039f5e4 0000002a 0039f5e8 0000002b 0039f5ec 0000002c 0039f5f0 0000002d 0039f5f4 0000002e 0039f5f8 0000002f 0039f5fc 00000030 0039f600 00000031 0039f604 00000032 0039f608 00000033 0039f60c 00000034 0039f610 00000035 0039f614 00000036 0039f618 00000037 0039f61c 00000038 0039f620 00000039 0039f624 0000003a 0039f628 0000003b 0039f62c 0000003c 0039f630 0000003d 0039f634 0000003e 0039f638 0000003f 0039f63c 00000040 0039f640 00000041 0039f644 00000042 0039f648 00000043 0039f64c 00000044 0039f650 00000045 0039f654 00000046 0039f658 00000047 0039f65c 00000048 0039f660 00000049 0039f664 0000004a 0039f668 0000004b 0039f66c 0000004c 0039f670 0000004d 0039f674 0000004e 0039f678 0000004f 0039f67c 00000050 0039f680 00000051 0039f684 00000052 0039f688 00000053 0039f68c 00000054 0039f690 00000055 0039f694 00000056 0039f698 00000057 0039f69c 00000058 0039f6a0 00000059 0039f6a4 0000005a 0039f6a8 0000005b 0039f6ac 0000005c 0039f6b0 0000005d 0039f6b4 0000005e 0039f6b8 0000005f 0039f6bc 00000060 0039f6c0 00000061 0039f6c4 00000062 0039f6c8 00000063 0039f6cc 00000064 0039f6d0 00000065 0039f6d4 00000066 0039f6d8 00000067 0039f6dc 00000068 0039f6e0 00000069 0039f6e4 0000006a 0039f6e8 0000006b 0039f6ec 0000006c 0039f6f0 0000006d 0039f6f4 0000006e 0039f6f8 0000006f 0039f6fc 00000070 0039f700 00000071 0039f704 00000072 0039f708 00000073 0039f70c 00000074 0039f710 00000075 0039f714 00000076 0039f718 00000077 0039f71c 00000078 0039f720 00000079 0039f724 0000007a 0039f728 0000007b 0039f72c 0000007c 0039f730 0000007d 0039f734 0000007e 0039f738 0000007f 0039f73c 00000080 0039f740 00000081 0039f744 00000082 0039f748 00000083 0039f74c 00000084 0039f750 00000085 0039f754 00000086 0039f758 00000087 0039f75c 00000088 0039f760 00000089 0039f764 0000008a 0039f768 0000008b 0039f76c 0000008c 0039f770 0000008d 0039f774 0000008e 0039f778 0000008f 0039f77c 00000090 0039f780 00000091 0039f784 00000092 0039f788 00000093 0039f78c 00000094 0039f790 00000095 0039f794 00000096 0039f798 00000097 0039f79c 00000098 0039f7a0 00000099 0039f7a4 0000009a 0039f7a8 0000009b 0039f7ac 0000009c 0039f7b0 0000009d 0039f7b4 0000009e 0039f7b8 0000009f 0039f7bc 000000a0 0039f7c0 000000a1 0039f7c4 000000a2 0039f7c8 000000a3 0039f7cc 000000a4 0039f7d0 000000a5 0039f7d4 000000a6 0039f7d8 000000a7 0039f7dc 000000a8 0039f7e0 000000a9 0039f7e4 000000aa 0039f7e8 000000ab 0039f7ec 000000ac 0039f7f0 000000ad 0039f7f4 000000ae 0039f7f8 000000af 0039f7fc 000000b0 0039f800 000000b1 0039f804 000000b2 0039f808 000000b3 0039f80c 000000b4 0039f810 000000b5 0039f814 000000b6 0039f818 000000b7 0039f81c 000000b8 0039f820 000000b9 0039f824 000000ba 0039f828 000000bb 0039f82c 000000bc 0039f830 000000bd 0039f834 000000be 0039f838 000000bf 0039f83c 000000c0 0039f840 000000c1 0039f844 000000c2 0039f848 000000c3 0039f84c 000000c4 0039f850 000000c5 0039f854 000000c6 0039f858 000000c7 0039f85c 00b455f8 0039f860 00000001 0039f864 00590f20 0039f868 00000111 0039f86c 00bb9930 0039f870 00b99890 0039f874 00000000 0039f878 001005d2 0039f87c 00000f20 0039f880 0039f8a4 0039f884 75b096d5 user32!SendMessageW+0x7f 0039f888 00b455d0 0039f88c 00000000 0039f890 5b68855d mfc90+0x5855d 0039f894 000003e8 0039f898 000209e6 0039f89c 00000000 0039f8a0 00000001 0039f8a4 0039f8bc 0039f8a8 75b45feb user32!xxxButtonNotifyParent+0x66 0039f8ac 001005d2 0039f8b0 00000111 0039f8b4 000003e8 0039f8b8 000209e6 0039f8bc 0039f8e4 0039f8c0 75b4612c user32!xxxBNReleaseCapture+0x138
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216

可以看到,在地址0039f884 之后又可以解析出來符號,所以,我們大概可以判斷39f568-0039f884 之間的棧被破壞了。對于這個DUMP文件,我們能做的差不多就這些了。由于棧被破壞,我們無法再回溯函數調用,無法再進一步定位異常的位置。因此,DUMP文件由于是一種靜止的快照,有點時候,只能作為一種輔助分析手段,要定位具體的原因,需要多個DUMP文件綜合分析,還需要進行動態調試。

總結

以上是生活随笔為你收集整理的DUMP文件分析4:栈溢出的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。