公司内部文档安全软件coredump分析实例

系统: windows xp sp3

崩溃软件: 公司内部某文档安全软件

调试工具: windbg

反汇编工具: ida pro 5.5

介绍: 该文档安全软件是由公司内部vpn工具启动,当在vpn工具输入用户密码连接网络后,vpn工具会自动把文档安全软件启动, 但每次启动都会coredump. 由于电脑用了windbg作为实时调试器,每次启动windbg都会弹出来, 显示coredump位置

分析过程:

coredump信息

(50c4.50d0): Access violation - code c0000005 (!!! second chance !!!)

eax=00000000 ebx=01aa5c62 ecx=00000000 edx=7efefeff esi=01aa4e34 edi=0012dbe0

eip=10009ffb esp=0012d980 ebp=0012dae0 iopl=0         nv up ei pl zr na pe nc

cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246

*** WARNING: Unable to verify checksum for C:\Program Files\MarkAny\Document SAFER\MAAgtClient.DLL

*** ERROR: Symbol file could not be found.  Defaulted to export symbols for C:\Program Files\MarkAny\Document SAFER\MAAgtClient.DLL -

MAAgtClient!CDRMLogin::SetDocHeaderByServerAcl+0x54a9:

10009ffb 8b01            mov     eax,dword ptr [ecx]  ds:0023:00000000=????????

由上面可以看coredump是由于往空地址里取值.

*** ERROR: Symbol file could not be found.  Defaulted to export symbols for
C:\Program Files\MarkAny\Document SAFER\MAAgtClient.DLL
-

可知, coredump地址是位于MAAgtClient.DLL

用IDA打开MAAgtClient.DLL, 查看一下coredump地址的汇编, 看一下ecx是由哪里得到的.

.text:10009FD1 loc_10009FD1:                           ; CODE XREF: _strcpy+5 j

.text:10009FD1                                         ; _strcat+52 j ...

.text:10009FD1                 mov    
ecx, [esp+4+Source]

.text:10009FD5                 test    ecx, 3

.text:10009FDB                 jz      short loc_10009FF6

.text:10009FDD

.text:10009FDD loc_10009FDD:                           ; CODE XREF: _strcat+7D j

.text:10009FDD                 mov     dl, [ecx]

.text:10009FDF                 inc     ecx

.text:10009FE0                 test    dl, dl

.text:10009FE2                 jz      short loc_1000A048

.text:10009FE4                 mov     [edi], dl

.text:10009FE6                 inc     edi

.text:10009FE7                 test    ecx, 3

.text:10009FED                 jnz     short loc_10009FDD

.text:10009FEF                 jmp     short loc_10009FF6

.text:10009FF1 ; ---------------------------------------------------------------------------

.text:10009FF1

.text:10009FF1 loc_10009FF1:                           ; CODE XREF: _strcat+9E j

.text:10009FF1                                         ; _strcat+B8 j

.text:10009FF1                 mov     [edi], edx

.text:10009FF3                 add     edi, 4

.text:10009FF6

.text:10009FF6 loc_10009FF6:                           ; CODE XREF: _strcat+6B j

.text:10009FF6                                         ; _strcat+7F j

.text:10009FF6                 mov     edx, 7EFEFEFFh

.text:10009FFB                 mov     eax, [ecx]

.text:10009FFD                 add     edx, eax

.text:10009FFF                 xor     eax, 0FFFFFFFFh

.text:1000A002                 xor     eax, edx

.text:1000A004                 mov     edx, [ecx]

.text:1000A006                 add     ecx, 4

.text:1000A009                 test    eax, 81010100h

.text:1000A00E                 jz      short loc_10009FF1

.text:1000A010                 test    dl, dl

.text:1000A012                 jz      short loc_1000A048

.text:1000A014                 test    dh, dh

.text:1000A016                 jz      short loc_1000A03F

.text:1000A018                 test    edx, 0FF0000h

.text:1000A01E                 jz      short loc_1000A032

.text:1000A020                 test    edx, 0FF000000h

.text:1000A026                 jz      short loc_1000A02A

.text:1000A028                 jmp     short loc_10009FF1

从上面看,主要是这一行

.text:10009FD1                 mov     ecx, [esp+4+Source]

给ecx赋值的.

Source这个是指代什么的数据呢? 在IDA中, 应该是这个函数开初就有定义.

.text:10009FD1 loc_10009FD1:                           ; CODE XREF: _strcpy+5 j

.text:10009FD1                                         ; _strcat+52 j ...

可以看到

.text:10009FD1

是由_strcat, _strcpy来引用

先看一下_strcat的开始

.text:10009F70 ; char *__cdecl strcat(char *Dest, const char *Source)

.text:10009F70 _strcat         proc near               ; CODE XREF: sub_1000F800+E6 p

.text:10009F70                                         ; sub_1000F800+F7 p ...

.text:10009F70

.text:10009F70 Dest            = dword ptr  4

.text:10009F70 Source          = dword ptr  8

和_strcpy的开始

.text:10009F60 ; char *__cdecl strcpy(char *Dest, const char *Source)

.text:10009F60 _strcpy         proc near               ; CODE XREF: CDRMLogin::GetUserID(char *)+3C p

.text:10009F60                                         ; CDRMLogin::GetLocalLoginPW(char *)+51 p ...

.text:10009F60

.text:10009F60 Dest            = dword ptr  4

.text:10009F60 Source          = dword ptr  8

可以看到, Source是指向_strcat, _strcpy的第二个参数源字符串的地址. 当这个地址为空,就出现coredump. 那么这个空地址是从哪里传进来的? 还有, coredump的函数是_strcat还是_strcpy?

看一下堆栈:

0:000> kb

ChildEBP RetAddr  Args to Child

WARNING: Stack unwind information not available. Following frames may be wrong.

0012dae0 0040bd5f 0012dbe0 0012eb4b 01aa5c56 MAAgtClient!CDRMLogin::SetDocHeaderByServerAcl+0x54a9

0012daf8 7c980d45 01aa4c14 01aa6038 01aa5c62 MADRMAgent!CAclCCF::~CAclCCF+0x2a1f

0012db54 7c937d3b 0012dc16 00000524 7c920000 ntdll!RtlWalkFrameChain+0xb3

0012dba4 7c937c02 7c920000 0012dc16 0012dc10 ntdll!LdrGetProcedureAddress+0x4b

0012dc74 7c92dfba 7c802277 7c92d34a 00000086 ntdll!RtlCompareUnicodeString+0x412

00000000 00000000 00000000 00000000 00000000 ntdll!NtWriteVirtualMemory+0xc

根据x86的调用约定, 0040bd5f是上一层的调用者返回地址. 详情请见<coredump问题原理探究>第三章.

先看一下0040bd5f是位于哪个模块

0:000> lm

start    end        module name

00390000 003e1000   cipher     (deferred)

003f0000 003f9000   Normaliz   (deferred)

00400000 0053b000   MADRMAgent   (export symbols)       C:\Program Files\MarkAny\Document SAFER\MADRMAgent.exe

01540000 0157f000   Encryption   (deferred)

01fe0000 0202a000   VrvHook    (deferred)

020e0000 02108000   ImageSAFERFilter   (deferred)

10000000 10029000   MAAgtClient C (export symbols)       C:\Program Files\MarkAny\Document SAFER\MAAgtClient.DLL

13000000 1308f000   libdb41    (deferred)

1f840000 1f857000   odbcint    (deferred)

3e410000 3e4f7000   WININET    (deferred)

3eab0000 3ec9c000   iertutil   (deferred)

43ce0000 43e14000   urlmon     (deferred)

5adc0000 5adf7000   uxtheme    (deferred)

5fdd0000 5fe25000   NETAPI32   (deferred)

60fd0000 61025000   hnetcfg    (deferred)

61be0000 61bed000   MFC42LOC   (deferred)

62c20000 62c29000   LPK        (deferred)

68000000 68036000   rsaenh     (deferred)

719c0000 719fe000   mswsock    (deferred)

71a00000 71a08000   wshtcpip   (deferred)

71a10000 71a18000   WS2HELP    (deferred)

71a20000 71a37000   WS2_32     (deferred)

71a40000 71a4b000   WSOCK32    (deferred)

72240000 72245000   sensapi    (deferred)

72f70000 72f96000   WINSPOOL   (deferred)

73540000 7357d000   ODBC32     (deferred)

73640000 7366e000   msctfime   (deferred)

73d30000 73e22000   MFC42      (deferred)

73fa0000 7400b000   USP10      (deferred)

74680000 746cc000   MSCTF      (deferred)

759d0000 75a7f000   USERENV    (deferred)

75ff0000 76055000   MSVCP60    (deferred)

76060000 761b6000   setupapi   (deferred)

762f0000 762f5000   MSIMG32    (deferred)

76300000 7631d000   IMM32      (deferred)

76320000 76367000   comdlg32   (deferred)

76760000 7676c000   cryptdll   (deferred)

76990000 76ace000   ole32      (deferred)

76b10000 76b3a000   WINMM      (deferred)

76bc0000 76bcb000   psapi      (deferred)

76d30000 76d48000   iphlpapi   (deferred)

76d70000 76d92000   Apphelp    (deferred)

76e50000 76e5e000   rtutils    (deferred)

76e60000 76e72000   rasman     (deferred)

76e80000 76eaf000   TAPI32     (deferred)

76eb0000 76eec000   RASAPI32   (deferred)

76ef0000 76f17000   DNSAPI     (deferred)

76f90000 76f96000   rasadhlp   (deferred)

770f0000 7717b000   OLEAUT32   (deferred)

77180000 77283000   COMCTL32   (deferred)

77bd0000 77bd8000   VERSION    (deferred)

77be0000 77c38000   msvcrt     (deferred)

77c40000 77c65000   msv1_0     (deferred)

77d10000 77da0000   USER32     (deferred)

77da0000 77e49000   ADVAPI32   (deferred)

77e50000 77ee3000   RPCRT4     (deferred)

77ef0000 77f39000   GDI32      (deferred)

77f40000 77fb6000   SHLWAPI    (deferred)

77fc0000 77fd1000   Secur32    (deferred)

78480000 7850e000   MSVCP90    (deferred)

78520000 785c3000   MSVCR90    (deferred)

7c800000 7c91e000   kernel32   (deferred)

7c920000 7c9b6000   ntdll      (export symbols)       C:\WINDOWS\system32\ntdll.dll

7d590000 7dd84000   SHELL32    (deferred)

Unloaded modules:

71dd0000 71de5000   msapsspc.dll

78080000 78091000   MSVCRT40.dll

767c0000 767e9000   schannel.dll

765e0000 76675000   CRYPT32.dll

76db0000 76dc2000   MSASN1.dll

757f0000 75805000   digest.dll

72f10000 72f57000   msnsspc.dll

78080000 78091000   MSVCRT40.dll

02260000 0227c000   DSWrapper.dll

02280000 0228b000   MASYSID.dll

可见0040bd5f是位于C:\Program Files\MarkAny\Document SAFER\MADRMAgent.exe

用IDA打开MADRMAgent.exe , 并跳转0040bd5f的附近汇编.

.text:0040BD57                 push    edx

.text:0040BD58                 stosw

.text:0040BD5A                 call    [email protected]@@[email protected] ; CDRMLogin::GetUserID(char *)

.text:0040BD5F                 lea     eax, [esp+102Ch+var_F38]

看来堆栈有一些调用没有显示.那么看一下CDRMLogin::GetUserID是在哪定义

0:000> x *!*GetUserID*

00396300 cipher!CFlexibleHeader::GetUserID (<no parameter info>)

0039bc80 cipher!CCCF::GetUserID (<no parameter info>)

003a1080 cipher!CDRMLogic::GetUserID (<no parameter info>)

10004473 MAAgtClient!CDRMLogin::GetUserID (<no parameter info>)

可见, CDRMLogin::GetUserID是在MAAgtClient.DLL定义

看一下它的汇编:

.text:10004473 ; int __stdcall CDRMLogin__GetUserID(char *Dest)

.text:10004473                 public [email protected]@@[email protected]

.text:10004473 [email protected]@@[email protected] proc near ; DATA XREF: .rdata:off_1001AB68 o

.text:10004473

.text:10004473 var_150         = byte ptr -150h

.text:10004473 var_C           = dword ptr -0Ch

.text:10004473 var_4           = dword ptr -4

.text:10004473 Dest            = dword ptr  8

.text:10004473

.text:10004473                 mov     eax, offset sub_10014714

.text:10004478                 call    __EH_prolog

.text:1000447D                 sub     esp, 144h

.text:10004483                 lea     ecx, [ebp+var_150]

.text:10004489                 call    ds:[email protected]@[email protected] ; CCCF::CCCF(void)

.text:1000448F                 and     [ebp+var_4], 0

.text:10004493                 lea     ecx, [ebp+var_150]

.text:10004499                 call    ds:[email protected]@@QAEHXZ ; CCCF::CheckCCFValidity(void)

.text:1000449F                 lea     ecx, [ebp+var_150]

.text:100044A5                 call    ds:[email protected]@@QAEPADXZ ; CCCF::GetUserID(void)

.text:100044AB                 push    eax             ; Source

.text:100044AC                 push    [ebp+Dest]      ; Dest

.text:100044AF                 call    _strcpy

.text:100044B4                 or      [ebp+var_4], 0FFFFFFFFh

.text:100044B8                 pop     ecx

.text:100044B9                 pop     ecx

.text:100044BA                 lea     ecx, [ebp+var_150]

.text:100044C0                 call    ds:[email protected]@[email protected] ; CCCF::~CCCF(void)

.text:100044C6                 mov     ecx, [ebp+var_C]

.text:100044C9                 mov     large fs:0, ecx

.text:100044D0                 leave

.text:100044D1                 retn    4

.text:100044D1 [email protected]@@[email protected] endp

.text:100044A5                 call    ds:[email protected]@@QAEPADXZ ; CCCF::GetUserID(void)

.text:100044AB                 push    eax             ; Source

.text:100044AC                 push    [ebp+Dest]      ; Dest

.text:100044AF                 call    _strcpy

可知,coredump的地址是位于_strcpy, 而_strcpy的第二个参数是CCCF::GetUserID的返回值.

从这里可以看到, 这里的代码是没有对CCCF::GetUserID的返回值进行判空处理, 从而导致coredump

至于是否会由于strcpy而导致栈溢出, 就先不管了.

时间: 2024-10-24 09:51:22

公司内部文档安全软件coredump分析实例的相关文章

源代码防泄密的失败案例(文档加密软件)

使用文档加密软件加密保护源代码,实现源代码防泄密.目前实践效果很差,以下失败案例可供查证: 比亚迪.宇龙通讯.酷派.国人通讯等(都是同一家公司做的,名字就不说了,问用户就知道了,北京的.) 1)卡.慢.蓝屏.损坏数据: 2)存在漏洞.安全性不高: 3)技术上争议不断:

文档加密软件的秘密

在当前信息泄露事件时有发生的大背景下,如何保障信息.文档类数据安全,实现数据防泄密目的显得尤为重要.就数据防泄密而言,文档加密软件是其中的有效方法之一,但除此以外还有DLP数据泄露防护系统以及专业用于源代码防泄密的DSA数据安全隔离等多种技术手段. 在整个加解密过程中,无需用户参与,使用非常方便.文档加密软件通常主要用于文档.图纸类数据加密保护,而不能用于源代码等进程比较复杂的数据类型保护. 目前文档加密软件已是非常成熟的产品,可实现以下几方面数据防泄密效果: 1)文档透明加密-在文档创建时即加

文档转换软件Print2Flash超链接的使用

Print2Flash文档中也包含了类似于Web页面中的超链接.点击超链接,用户可以打开超链接所指向的位置.文件转换后的Print2Flash文档中的超链接由一个悬停在文件转换文档中的特殊鼠标光标标识.只有在Drag模式下才可以点击超链接.目前支持超链接的方法有以下两种: 直接从源文件中提取超链接 该方法从源文件中检索超链接并在输出的Flash文件中创建相应的超链接.目前,该方法支持以下文件类型: Microsoft Word Microsoft PowerPoint PDF 如果你不想在输出的

小讲堂:在线编辑在Mobox文档管理软件中的意义

今天我们来讨论一下,mobox文档管理软件中的在线编辑的这个功能,相信这个功能是用户在日常的文档维护中非常需要的. 文档管理软件的诸多功能中,在线编辑是一块很重要的功能点,因为在线编辑可以说是提高工作效率的最主要的功能点,没有之一. 很多文档是需要及时更新,做内容的增加或者删减,如果下载修改再上传,这是一个很繁琐的过程.所以在线编辑是一个非常必要的提高工作效率的功能. Mobox文档管理软件的在线编辑分为三个部分:个人网盘,协同区,单位部门文档柜. 在个人网盘中,选择文件双击,则该文件下载并被打

Qt:多文档(MDI)文档处理软件思路01

文档处理软件是我们日常生活中最为常用的软件之一.在此以将记事本为例子,实现的基本思路描述. 一:基本外观功能. 1)有菜单栏和按钮,根据不同的实现功能,将按钮添加到菜单中,并且添加工具栏. 2)主窗口显示(在此不同于记事本,为多文本窗口). 在Qt中按钮的显示以QAction来替代,菜单和工具栏为QMenu和QToolBar,部分代码如下:     //in file menu.     QAction* pActionNew;     QAction* pActionOpen;     QAc

Windows文件系统加密软件哪个好用?公司电脑文档加密应该怎么做呢?山东风奥科技

如何的市场,伴随着信息化技术的推进,企业的日常办公都有赖于对电脑的使用,电脑成为日常数据产生,以及日常数据存储的通道之一.电子化设备的使用,不仅方便了政企机关单位,同时对人们的生产生活也造成了巨大的影响,信息化一方面给企业的办公带来了便利,另一方面也使得电脑文件在生产和使用中面临着数据泄露的风险.因而,对于现阶段的企事业单位以及国内的相关机构来说,采取必要的措施来实现对自身环境下的数据文件加密,是非常有必要的. 为什么说是Windows系统加密?毕竟Windows系统底层是对外开放接口的,能够做

程序员开发学习利器篇(下)之文档资料软件-获取软件、资料的最好途径

以下内容,开发初学者看,熟手略过. 论语有言: 工欲善其事 必先利其器 ,意思是工匠想要使他的工作做好,一定要先让工具锋利.比喻要做好一件事,准备工作非常重要. 第二篇我们来说说软件.文档资料.信息获取的高效途径. 首先说句题外话,程序员的软件.资料学习盘 应该是这个样子的: 文件夹视图应该是 详细列表 并且应用到电脑所有文件夹,方便查看文件的全名 最新的修改日期 类型 大小.并且文件显示应该是全名称 包括后缀名,文件目录起名字最好都是英文的,尤其是软件的安装目录,因为有些软件不识别中文的路径.

文档加密软件---华途

文档透明加密系统,是国内最早的为核心信息资产提供全方位内容安全防护的安全防护系统之一. DLP以数据透明加密技术为核心,通过信息安全边界建立,降低核心信息资产的有意或无意泄密风险,如源代码.设计图纸.财务数据.经营分析以及其他.  对于核心数据,需要控制数据过程使用安全时,采用透明加密控制方式控制数据的安全使用.系统采用基于Windows文件系统驱动开发,结合高强度国际流行加密算法,对文件进行驱动层加解密操作.对于需要保护的文件类型,系统会在文件保存时对其进行强制性的加密,并且不改变文件的格式和

【软件工程】 文档 - 银行业务管理 - 面向对象分析与设计

软件工程 银行业务管理和现金结算系统 --- 面向对象分析与设计文档  ***原创所有,本文禁止一切形式的未授权转载,如需转载联系作者,请尊重作者权利. 以下UML建模图仅供参考. 一.面向对象分析 1.      建立用例模型 i. 开户 用例描述:开户用例图中,由管理员发起开户事务,储户提供账户信息.身份信息,管理员验证账户合法性和身份真实性后输入账户信息,储户设置密码,过程中涉及验证合法性(账户号正确.身份真实等).添加账户信息等.储户可以打印凭证. ii. 销户 用例描述:销户用例图中,