-
-
[原创]PPStream 2.1.16.1003 溢出问题
-
发表于:
2007-11-12 23:07
9475
-
[原创]PPStream 2.1.16.1003 溢出问题
/*
PPStream
PowerList.ocx
2.1.6.2916
描述:
SetBkImage 堆和栈溢出, 还是以前的老问题。以前补的是PowerPlayer.dll中的
这里利用堆溢出和栈溢出,使用 CFindFile 对参数检查不严格,导致堆溢出。
在其析构时会导致异常,并且在析构之前发生了 strcat 导致栈溢出,覆盖掉
原来的 seh 处理程序
author: dummyz@126.com
2007-11-11
*/
不要用在恶意用途,后果自负
//PowerList.ocx 2.1.6.2916
.text:1003178C
.text:1003178C SetBkImage proc near ; CODE XREF: sub_100307EB+80Bp
.text:1003178C ; sub_10031B3B+22p
.text:1003178C ; DATA XREF: .rdata:10040968o
.text:1003178C
.text:1003178C var_130 = dword ptr -130h
.text:1003178C
.text:1003178C mov eax, offset loc_1003E1DC
.text:10031791 call __EH_prolog
.text:10031791
.text:10031796 sub esp, 120h
.text:1003179C push ebx
.text:1003179D push esi
.text:1003179E push edi
.text:1003179F mov edi, [ebp+8] ; filepath
.text:100317A2 xor ebx, ebx
.text:100317A4 mov esi, ecx
.text:100317A6 cmp edi, ebx
.text:100317A8 jz loc_10031872
.text:100317A8
.text:100317AE push edi ; lpString
.text:100317AF call ds:lstrlenA
.text:100317B5 cmp eax, 1
.text:100317B8 jl loc_10031872
.text:100317B8
.text:100317BE lea ecx, [ebp-28h]
.text:100317C1 call CFileFind::CFileFind(void)
.text:100317C1
.text:100317C6 push ebx
.text:100317C7 push edi
.text:100317C8 lea ecx, [ebp-28h]
.text:100317CB mov [ebp-4], ebx
.text:100317CE call CFileFind::FindFile(char const *,ulong) ; 传递给 CFindFile 没有检查参数长度, 而 CFindFile 也没有检查
.text:100317CE ;
.text:100317CE ; // 摘自 v6 mfc 源码 filefind.cpp
.text:100317CE ; BOOL CFileFind::FindFile(LPCTSTR pstrName /* = NULL */,
.text:100317CE ; DWORD dwUnused /* = 0 */)
.text:100317CE ; {
.text:100317CE ; UNUSED_ALWAYS(dwUnused);
.text:100317CE ; Close();
.text:100317CE ; m_pNextInfo = new WIN32_FIND_DATA; // 从堆中分配内存
.text:100317CE ; m_bGotLast = FALSE;
.text:100317CE ;
.text:100317CE ; if (pstrName == NULL)
.text:100317CE ; pstrName = _T("*.*");
.text:100317CE ; lstrcpy(((WIN32_FIND_DATA*) m_pNextInfo)->cFileName, pstrName); // 没有检查上面传过来的参数长度,之间拷贝。导致恶意输入破坏掉堆
.text:100317CE ;
.text:100317CE
.text:100317D3 test eax, eax
.text:100317D5 jz short loc_100317E7
.text:100317D5
.text:100317D7 push edi ; dwBytes
.text:100317D8 lea ecx, [esi+220h]
.text:100317DE call sub_10033C51
.text:100317DE
.text:100317E3 test eax, eax
.text:100317E5 jmp short loc_1003184B
.text:100317E5
.text:100317E7 ; ---------------------------------------------------------------------------
.text:100317E7
.text:100317E7 loc_100317E7: ; CODE XREF: SetBkImage+49j
.text:100317E7 lea eax, [ebp-12Ch]
.text:100317ED push eax ; char *
.text:100317EE call sub_100316F0
.text:100317EE
.text:100317F3 lea eax, [ebp-12Ch]
.text:100317F9 mov [esp+130h+var_130], offset asc_1004A194 ; "\\"
.text:10031800 push eax ; char *
.text:10031801 call strcat
.text:10031801
.text:10031806 lea eax, [ebp-12Ch]
.text:1003180C push edi ; char *
.text:1003180D push eax ; char *
.text:1003180E call strcat ; 链接字符串再次没有检查参数,恶意输入导致堆栈溢出
.text:1003180E
.text:10031813 add esp, 10h
.text:10031816 lea edi, [esi+220h]
.text:1003181C lea eax, [ebp-12Ch]
.text:10031822 mov ecx, edi
.text:10031824 push eax ; dwBytes
.text:10031825 call sub_10033C51
...
.text:1003184D loc_1003184D: ; CODE XREF: sub_1003178C+A0j
.text:1003184D push 1 ; bErase
.text:1003184F push ebx ; lpRect
.text:10031850 push dword ptr [esi+774h] ; hWnd
.text:10031856 call ds:InvalidateRect
.text:10031856
.text:1003185C
.text:1003185C loc_1003185C: ; CODE XREF: sub_1003178C:loc_1003184Bj
.text:1003185C lea ecx, [ebp-28h]
.text:1003185F call CFileFind::Close(void)
.text:1003185F
.text:10031864 or dword ptr [ebp-4], 0FFFFFFFFh
.text:10031868 lea ecx, [ebp-28h]
.text:1003186B call CFileFind::~CFileFind(void) ;在析构时,会调用前面释放 new 的内存,如果前面发生了溢出
;会在这里发生异常,异常原因是覆盖掉了堆链中的一个函数指针
;在发生次函数调用时,访问违规。第一想是利用此来获取执行机会
;但是试了几次,成功机会很低(因为在构造 shellcode 前面一大段空
;指令时,这个空指令既当地址有当函数指针,其中先是使用 0x0a0d0a0d,
;在执行到 shellcode 之前会因为指令构造不对齐失败)。
;最后采用了堆栈溢出,覆盖 seh.在此处发生的异常,得到执行机会
.text:1003186B
.text:10031870 jmp short loc_100318A4
.text:10031870
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)