21,500
社区成员
发帖
与我相关
我的任务
分享
//这里是C++的源码
#include "stdafx.h"
void main()
{
int i;
try
{
i=0;
i++;
}
catch(...)
{
i++;
}
}
;这里是VC2008 输出的反汇编源码
; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.21022.08
TITLE d:\VC++应用程序\test\test\test\test.cpp
.686P
.XMM
include listing.inc
.model flat
INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES
PUBLIC _main
EXTRN ___security_cookie:DWORD
EXTRN ___CxxFrameHandler3:PROC
EXTRN @__security_check_cookie@4:PROC
EXTRN __RTC_Shutdown:PROC
EXTRN __RTC_InitBase:PROC
; COMDAT xdata$x
; File d:\vc++应用程序\test\test\test\test.cpp
xdata$x SEGMENT
__catchsym$_main$2 DD 040H
DD 00H
DD 00H
DD FLAT:__catch$_main$0
__unwindtable$_main DD 0ffffffffH
DD 00H
DD 0ffffffffH
DD 00H
__tryblocktable$_main DD 00H
DD 00H
DD 01H
DD 01H
DD FLAT:__catchsym$_main$2
__ehfuncinfo$_main DD 019930522H
DD 02H
DD FLAT:__unwindtable$_main
DD 01H
DD FLAT:__tryblocktable$_main
DD 2 DUP(00H)
DD 00H
DD 01H
xdata$x ENDS
; COMDAT rtc$TMZ
rtc$TMZ SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ ENDS
; COMDAT rtc$IMZ
rtc$IMZ SEGMENT
__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
; Function compile flags: /Odtp /RTCsu /ZI
rtc$IMZ ENDS
; COMDAT _main
_TEXT SEGMENT
_i$ = -24 ; size = 4
__$EHRec$ = -16 ; size = 16
_main PROC ; COMDAT
; 7 : {
push ebp
mov ebp, esp
push -1
push __ehhandler$_main
mov eax, DWORD PTR fs:0
push eax
push ecx
sub esp, 204 ; 000000ccH
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-220]
mov ecx, 51 ; 00000033H
mov eax, -858993460 ; ccccccccH
rep stosd
mov eax, DWORD PTR ___security_cookie
xor eax, ebp
push eax
lea eax, DWORD PTR __$EHRec$[ebp+4]
mov DWORD PTR fs:0, eax
mov DWORD PTR __$EHRec$[ebp], esp
; 8 : int i;
; 9 : try
; 10 : {
mov DWORD PTR __$EHRec$[ebp+12], 0
; 11 : i=0;
mov DWORD PTR _i$[ebp], 0
; 12 : i++;
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
; 13 : }
jmp SHORT $LN4@main
__catch$_main$0:
; 14 : catch(...)
; 15 : {
; 16 : i++;
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
; 17 : }
mov DWORD PTR __$EHRec$[ebp+12], -1
mov eax, $LN2@main
ret 0
$LN4@main:
mov DWORD PTR __$EHRec$[ebp+12], -1
$LN2@main:
; 18 : }
xor eax, eax
mov ecx, DWORD PTR __$EHRec$[ebp+4]
mov DWORD PTR fs:0, ecx
pop ecx
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret 0
_TEXT ENDS
; COMDAT text$x
text$x SEGMENT
__ehhandler$_main:
mov edx, DWORD PTR [esp+8]
lea eax, DWORD PTR [edx+12]
mov ecx, DWORD PTR [edx-224]
xor ecx, eax
call @__security_check_cookie@4
mov eax, OFFSET __ehfuncinfo$_main
jmp ___CxxFrameHandler3
text$x ENDS
_main ENDP
END
TITLE d:\VC++应用程序\test\test\test\test.cpp
.686P
.XMM
include listing.inc
.model flat
INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES
PUBLIC _main
EXTRN ___security_cookie:DWORD
EXTRN ___CxxFrameHandler3:PROC
EXTRN @__security_check_cookie@4:PROC
EXTRN __RTC_Shutdown:PROC
EXTRN __RTC_InitBase:PROC
; COMDAT xdata$x
; File d:\vc++应用程序\test\test\test\test.cpp_i$ = -24 ; size = 4
__$EHRec$ = -16 ; size = 16_main PROC ; COMDAT
; 7 : {
push ebp
mov ebp, esp//保护上级函数的参数
push -1
push __ehhandler$_main
mov eax, DWORD PTR fs:0
push eax
push ecx
sub esp, 204 ; 000000ccH //划分要用的堆栈
push ebx
push esi
push edi
lea edi, DWORD PTR [ebp-220] // rep stosd,把edi指向的ecx*4字节的数据覆盖为eax.
//即将自己堆栈初始化为0xcccccccc,这特色的数字在溢出时有助于定位溢出code
mov ecx, 51 ; 00000033H
mov eax, -858993460 ; ccccccccH
rep stosd
mov eax, DWORD PTR ___security_cookie //cookie为vc带/GS保护堆栈参数时的产品。
//意为, 在缓冲区和返回地址间的"缓冲带"
//发生溢出则cookie会首先被覆盖,在函数结束调用返回地址前检查cookie若错误则已溢出停止执行,便阻止了对溢
//出的利用
xor eax, ebp
push eax
lea eax, DWORD PTR __$EHRec$[ebp+4] //初始化SEH结构
mov DWORD PTR fs:0, eax //fs:0为ETHREAD 结构,fs:[0]为当前函数的SEH结构指针
mov DWORD PTR __$EHRec$[ebp], esp//此处的__$EHRec$为__ehhandler$_main的别名
mov DWORD PTR __$EHRec$[ebp+12], 0
; 8 : int i; //所的对应c++code
; 9 : try
; 10 : {; 11 : i=0;
mov DWORD PTR _i$[ebp], 0
; 12 : i++;
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax; 13 : }
jmp SHORT $LN4@main$LN4@main:
mov DWORD PTR __$EHRec$[ebp+12], -1
$LN2@main:
; 18 : }
xor eax, eax
mov ecx, DWORD PTR __$EHRec$[ebp+4] //恢复FS:0为上个函数的SEH结构
mov DWORD PTR fs:0, ecx
pop ecx
pop edi
pop esi
pop ebx
mov esp, ebp //整理堆栈。抛弃本函数的堆栈
pop ebp
ret 0 //返回上层函数
_TEXT ENDS
; COMDAT text$x
text$x SEGMENT
__catch$_main$0:
; 14 : catch(...)
; 15 : {
; 16 : i++;
mov eax, DWORD PTR _i$[ebp] //捕获到异常后执行 i= i+1; i= i;
add eax, 1
mov DWORD PTR _i$[ebp], eax
; 17 : }
mov DWORD PTR __$EHRec$[ebp+12], -1//置空本函数SEH callback的指针
mov eax, $LN2@main//返回给运行时库 下一步要执行的code
ret 0__ehhandler$_main:
mov edx, DWORD PTR [esp+8]
lea eax, DWORD PTR [edx+12]
mov ecx, DWORD PTR [edx-224]
xor ecx, eax
call @__security_check_cookie@4
mov eax, OFFSET __ehfuncinfo$_main
jmp ___CxxFrameHandler3
text$x ENDS
_main ENDP
END