win32k.sys·ì϶ÍÚ¾ò˼·½â¶Á
°ä²¼¹¦·ò 2020-05-09Ò»¡¢¡¢¡¢×êÑв¼¾°
4ÔÂ1ÈÕ£¬£¬£¬ÒÔÉ«Áа²È«×êÑÐÔ±Gil DabahÔÚ²©¿ÍÉϰ䲼ÁËһƪ¹ØÓÚwin32k·ì϶×êÑÐÎÄÕ£¬£¬£¬ÃèÊöÁËÈôºÎͨ¹ýÄÚ²é¶ÔÏóµÄDestroyº¯ÊýºÍwin32k user-mode callback»º½â´ëÊ©µÄ¸öÐÔÀ´Ñ°ÕÒUAF·ì϶µÄÐÂ˼·¡£¡£¡£
Ϊ´Ë£¬£¬£¬OG¶«·½ÌüADLab¶Ôwin32kÓйØÄں˻úÖÆ½øÐÐ×êÑзÖÎö£¬£¬£¬²¢¶ÔÕâÀà·ì϶µÄÍÚ¾ò˼·½øÐоßÌå½â¶Á·ÖÎö¡£¡£¡£
¶þ¡¢¡¢¡¢win32k·ì϶»º½âÓëÆ¥µÐ
2.1 win32k user-mode callback·ì϶
ÓÉÓÚÉè¼ÆÔÒò£¬£¬£¬win32kÇý¶¯±ØÒª´¦ÖúöàÓû§²ãµÄ»Øµ÷£¬£¬£¬ÕâЩ»Øµ÷¸øwin32kÄ£¿£¿£¿éµÄ°²È«´øÀ´Á˼«¶È´óµÄÒþ»¼£¬£¬£¬²¢ÔÚ´Óǰ10Ä깦·ò¹±Ï×ÁË´óÁ¿µÄ·ì϶¡£¡£¡£
ΪÁ˱ãÓÚ·ì϶ÃèÊö£¬£¬£¬ÒÔÈçÏÂα´úÂë½øÐоÙÀý·ÖÎö¡£¡£¡£
NtUserSysCall()
£û
PWND p = CreateWindowEx(¡);
somecallback();
xxxSetWindowStyle(p);
£ý
ÉÏÊö´úÂëÖ´ÐгÉЧÈçÏÂͼËùʾ£¬£¬£¬Óû§²ãÖ´ÐеÄijº¯Êýͨ¹ýsyscall´«ÈëÄں˲㣬£¬£¬µ±Äں˲ã´úÂëÖ´Ðе½somecallbackÕâÒ»¾äʱ£¬£¬£¬Óû§²ãÄܹ»ÔÚÓû§½ç˵µÄcallbackº¯ÊýÖлñµÃ´úÂëÖ´ÐеĻúÓö£¬£¬£¬ÈôÊÇÓû§ÔÚcallbackº¯ÊýŲÓÃÁËDestroyWindowº¯ÊýÏú»Ù´°¿Úp£¬£¬£¬Äں˲ãµÄÏàÓ¦Ïú»Ù´úÂ뽫»á±»Ö´ÐУ¬£¬£¬pµÄÏàÓ¦ÄÚ´æ±»¿ªÊÍ£¬£¬£¬»Øµ÷Ö´ÐнáÊø£¬£¬£¬NtUserSysCallº¯Êý³ÖÐøÖ´ÐУ¬£¬£¬µ±Ö´Ðе½xxxSetWindowStyle(p)Ò»¾äʱ£¬£¬£¬ÓÉÓÚpµÄÄÚ´æÒѾ±»¿ªÊÍ´Ó¶øµ¼ÖÂUAF·ì϶µÄ²úÉú¡£¡£¡£
2.2 user-mode callback·ì϶»º½â»úÖÆ
ΪÁËÔ¤·ÀÉÏÊöÎÊÌâµÄ²úÉú£¬£¬£¬Î¢ÈíÔÚ¶ÔÏóÖÐÒýÈëÁËÒ»¸öÒýÓüÆÊý£¨¶ÔÏó+0x8´¦£©£¬£¬£¬¶ÔÏó·ÖÅäʱÒýÓüÆÊýΪ1£¬£¬£¬µ±Ö´ÐжÔÏóµÄDestroyº¯ÊýʱÒýÓüÆÊý¼õ1£¬£¬£¬µ±ÒýÓüÆÊýΪ0ʱ¶ÔÏó»á±»ÕæÕý¿ªÊÍ¡£¡£¡£Î¢Èíͨ¹ýËøµÄ¸ÅÄîΪ¶ÔÏóÔö³¤ºÍÏ÷¼õÒýÓüÆÊý£¬£¬£¬ÔÚwin32kÖÐΪ¶ÔÏóÖÎÀíÒýÓüÆÊýµÄËøÓÐÁ½ÖÖ±ðÀëÊÇÒ»Ê±Ëø£¨ÏàÓ¦º¯ÊýΪThreadLock/ ThreadUnlock£©ºÍÓÀÔ¶Ëø£¨ÏàÓ¦º¯ÊýΪHMAssignmentLock/ HMAssignmentUnlock£©¡£¡£¡£¾¹ý¼Ó¹ÌÖ®ºóÊÀÂë²û·¢ÎªÈçÏ´ó¾Ö£º
NtUserSysCall()
£û
PWND p = CreateWindowEx(¡);
ThreadLock(p);
Somecallback();
xxxSetWindowStyle(p);
ThreadUnlock();
£ý
ͨ¹ýÉÏÊö´úÂ룬£¬£¬Äܹ»±£Õϼ´±ãcallback±»Ö´ÐУ¬£¬£¬pÔÚxxxSetWindowStyleº¯ÊýÖ´ÐеÄʱ³½Ò²²»»á±»¿ªÊÍ¡£¡£¡£
2.3»º½â»úÖÆµÄÆ¥µÐ¼¼Êõ
ÉÏÒ»½ÚÌáµ½Á˶ÔÏóµÄÒýÓüÆÊý£¬£¬£¬ÈôÊǶÔÏóµÄÒýÓüÆÊýΪÕý£¬£¬£¬¼´±ãÖ´ÐжÔÏóµÄdestroyº¯Êý£¬£¬£¬¶ÔÏóûÓÐÕæÕý±»¿ªÊÍ£¬£¬£¬ÈԾɴæÁôÔÚÄÚ´æÖУ¬£¬£¬ÕâÖÖ¶ÔÏó±»Î¢Èí¿ª·¢Õß³ÆÎª½©Ê¬£¨Zombie£©¶ÔÏ󡣡£¡£Ò»µ©½©Ê¬¶ÔÏóµÄÒýÓüÆÊýÏ÷¼õµ½0Ëü½«»áÒþû£¬£¬£¬µ«ÊÇÔÚ´Ë֮ǰËüÈԾɴæÔÚÄÚ´æÖУ¬£¬£¬Ö»ÊÇÓû§²ãÎÞ·¨½Ó¼û¸Ã¶ÔÏ󡣡£¡£
ͬʱΪÁËÔ¤·À½©Ê¬¶ÔÏó³ÖÐø´æÁôÔÚÄÚ´æÖУ¬£¬£¬ËøµÄ¿ªÊͺ¯Êý£¨ThreadUnlock/ HMAssignmentUnlock£©Í¨³£»áÔ̺¬¶ÔÏóµÄ¿ªÊÍ»·½Ú¡£¡£¡£
¶ÔÏóµÄDestroyº¯Êý»¹ÓÐÒ»¸ö¸öÐÔ¾ÍÊÇÔÚ¿ªÊͶÔÏóµÄͬʱ£¬£¬£¬Destroyº¯ÊýÒ²»á¿ªÊͶÔÏóµÄ×Ó×ÊÔ´£¬£¬£¬Æä¹ý³ÌÄܹ»¼òÒªÃèÊöÈçÏ¡£¡£¡£
void xxxDestroyWindow(PWND pwnd)
£û
xxxFW_DestroyAllChildren(); // Destroy child windows, if exist!
if (NULL != pwnd->spmenu) // If there¡¯s a menu, remove and destroy it.
£û
PMENU tmp = pwnd->spmenu;
if (HMAssignmentUnlock(&pwnd->spmenu)) // If it¡¯s still locked
£û
DestroyMenu(tmp); // Try destroying it (it can remain a zombie).
£ý
£ý
DereferenceClass(pwnd);
if (HMMarkObjectDestroy(pwnd)) // Check for zero refs!
HmFreeObject(pwnd); // Only now free the object and handle pair.
£ý
DestroyWindowÔÚµÚÒ»´ÎŲÓÃʱ¿ªÊÍ×Ó×ÊÔ´£¬£¬£¬Ò»µ©´°¿Ú²»ÔÙ±»ÒýÓ㬣¬£¬¾ä±úÖÎÀíÆ÷¾Í»áÔÙ´ÎÆëÈ«Ïú»ÙËü£¬£¬£¬Í¨³£Çé¿öÏ£¬£¬£¬µÚ¶þ´ÎÏú»ÙDestroyº¯Êý²»»áÔÚÈ¥ÏòÀí×Ó×ÊÔ´£¬£¬£¬ÓÉÓÚµÚÒ»´ÎÒѾ¿ªÊÍÁËËùÓеÄ×Ó×ÊÔ´¡£¡£¡£
µ«ÊÇʼþÍùÍù²»ÊÇÕâôµ¥Ò»£¬£¬£¬ÊÂʵÉϼ´±ãÊÇÒ»¸öÒѾŲÓùýÏàÓ¦Destroyº¯Êý¿ªÊ͵Ľ©Ê¬¶ÔÏ󣬣¬£¬ÒÀÈ»ÓлúÓö¶ÔÆä×ÔÉí½øÐÐһЩ¸ü¸Ä£¨»Øµ÷Ö®ºóÄں˴úÂëÈÔ»á¶Ô¶ÔÏó½øÐÐһЩ²Ù×÷£©£¬£¬£¬ÎÒÃǰÑÕâÖÖÇé¿ö½Ð×öZombie Reload£¬£¬£¬µ±¸Ã½©Ê¬¶ÔÏóÓÉÓÚÒýÓüÆÊýΪ0¶ø±»ÕæÕý¿ªÊÍʱ£¬£¬£¬Ö®Ç°µÄ¸ü¸Ä²Ù×÷½«»á¸øÄں˴øÀ´Ò»Ð©Òþ»¼¡£¡£¡£
¶ÔÓÚÈçÏ´úÂëÆ¬¶Î£º
ThreadLock(pwnd);
xxxSomeCallback(); // Here we can destroy pwnd from user-mode.
InternalSetTimer(pwnd, ...); // reuse pwnd without check wether it is destroyed
ThreadUnlock();
SomefunctionUseTimer(); //UAF of Timer
ÎÒÃÇÔÚÓû§²ã»Øµ÷ÖжÔpwndÖ´ÐÐÁËDestroyº¯Êý£¬£¬£¬¶øºóͨ¹ýInternalSetTimerΪ֮ÉèÖÃÁËÒ»¸ö¼ÆÊ±Æ÷£¬£¬£¬µ±ThreadUnlock½«pwndÕæÕý¿ªÊ͵Äʱ³½£¬£¬£¬¼ÆÊ±Æ÷Ò²½«±»¿ªÊÍ£¬£¬£¬ÄÇô½ÓÏÂÀ´¶Ô¼ÆÊ±Æ÷µÄ²Ù×÷½«»áµ¼ÖÂUAF·ì϶µÄ²úÉú¡£¡£¡£
Èý¡¢¡¢¡¢°¸Àý·ÖÎö
ÉÏÒ»½ÚÎÒÃÇ»áÉÌÁ˶ÔÏóµÄÒýÓüÆÊýºÍËø¸ø¶ÔÏó´øÀ´µÄÐµİ²È«Òþ»¼£¬£¬£¬µ«ÊÇÕæÕýµÄÌôÕ½ÔÚÓÚÎÒÃÇÈôºÎÈ·¶¨Ò»¶Î´úÂëÖдæÔÚ·ì϶£¬£¬£¬¹Ø¼üµãÊÇÈ·±£ÔÚunlockº¯ÊýÖпªÊ͵ĶÔÏóÔÚÔËÐе½ÓÐÎÊÌâµÄ´úÂëʱÆäÒýÓüÆÊýÓ¦¸ÃΪ1£¬£¬£¬Ö»ÓÐÕâÑùÎÒÃÇÄÜÁ¦ÔÚÓû§²ã»Øµ÷ŲÓÃÆäDestroyº¯Êý£¬£¬£¬²¢Í¨¹ýunlockº¯Êý½«Õâ¸ö¶ÔÏóÕæÕý¿ªÊ͵ô£¨ÉÏËøµÄʱ³½»á×ö+1´¦Öã©£¬£¬£¬ÕâÒ²ÊÇÎÒÃǽÓÏÂÀ´±ØÒª»áÉ̵ġ£¡£¡£ÏÂÃæÎÒÃÇͨ¹ýÒ»¸ö°¸ÀýÀ´·ÖÎö·ì϶ÍÚ¾ò˼·¡£¡£¡£
3.1·ì϶³ÉÒò
ÏÂͼÊÇxxxMnOpenHierarchyº¯ÊýµÄ´úÂëÆ¬¶Î¡£¡£¡£
ͼÖÐͨ¹ýxxxCreateWindowExÄܹ»»ñµÃÒ»¸ö·µ»ØÓû§²ãÖ´ÐÐcallbackº¯ÊýµÄ»úÓö£¬£¬£¬xxxCreateWindowEx´´½¨µÄ´°¿Ú½«×÷Ϊ¸¸´°¿Ú*(struct tagWND **)(**v3 + 8)£¨ÉÏͼºì¿ò£©µÄ×Ó´°¿Ú£¬£¬£¬ÈôÊÇÎÒÃÇÄܹ»Í¨¹ýThreadUnlock¿ªÊ͸¸´°¿Ú£¬£¬£¬ÄÇô×Ó´°¿Úv32Ò²»á±»¿ªÊÍ£¬£¬£¬ËùÒÔµ±ºóÐøµÄsafe_cast_fnid_to_PMENUWNDº¯Êý½«v32×÷Ϊ²ÎÊýÖ´ÐÐʱ¾Í»á²úÉúÎÊÌ⣬£¬£¬ÖµÍ×ÌùÐĵÄÊÇͨ¹ý»Øµ÷¿ªÊÍv32ÊÇÐв»Í¨µÄ£¬£¬£¬ÈôÊÇÕâÑùxxxCreateWindowEx½«»á·µ»Ø0£¬£¬£¬ÎÞ·¨Í¨¹ýifÅжϡ£¡£¡£
ÕâÀïµÄÎÊÌâ¾ÍÔÚÓÚÈôºÎ±£Õϸ¸´°¿ÚÔÚThreadUnlockº¯ÊýÖ´ÐеÄʱ³½ÒýÓüÆÊýΪ1£¬£¬£¬ÓÉÓÚÒªÖ´ÐÐxxxMnOpenHierarchyº¯Êý±ØÒª½«¸¸´°¿Ú¹ØÁªµ½Ò»¸ömenu´°¿ÚÉÏ£¬£¬£¬´Ëʱ¸¸´°¿ÚºÍmenu´°¿Ú½«»á±»Ò»¸öÓÀÔ¶ËøËø×¡£¬£¬£¬ÏÂÃæÎÒÃǽéÉÜÈôºÎÈÆ¹ýÓÀÔ¶Ëø¡£¡£¡£
3.2 ·ì϶ÍÚ¾ò˼·
Ê×ÏÈÎÒÃÇ´´½¨ÁËg_hMenuOwnerºÍg_hNewOwnerÁ½¸ö´°¿Ú£¬£¬£¬ÆäÖÐg_hMenuOwnerµÄ²Ëµ¥¾ä±úΪhMenu£¬£¬£¬ËüÒ²ÊÇg_hNewOwnerµÄËùÓÐÕß¡£¡£¡£
ÔÚÉÏÊö´´½¨¹ý³ÌÖУ¬£¬£¬ÄÚºËͨ¹ýLockPopuMenuº¯Êý±ðÀëΪhMenuºÍg_hMenuOwnerÔö³¤ÁËÓÀÔ¶Ëø£¬£¬£¬ÎªÁË´ï³É¿ªÊÍÖ÷ÕÅ£¬£¬£¬Õâ¸öÓÀÔ¶Ëø±ØÒª±»Èƹý¡£¡£¡£
´ËÊ±ËøºÍËùÓÐÕߵĹØÏµÊÇÕâÑùµÄ£º
½ÓÏÂÀ´ÎÒÃÇͨ¹ýSetWindowsHookEx¸ø´°¿ÚÔö³¤ÁËWH_CBT¹³×Ó£¬£¬£¬²¢Èô°¿Ú½øÈëÐÂÎÅÑ»·ÖС£¡£¡£
SendMessage²Ù×÷Ϊg_hMenuOwnerÔö³¤Ò»¸öÒ»Ê±Ëø£¬£¬£¬ÓÉÓÚºóÐøµÄËùÓй¥»÷¶¼ÊÇÔÚmessageµÄ»Øµ÷ÖнøÐУ¬£¬£¬ËùÒÔ¶ÔÓÚg_hMenuOwnerÀ´ËµÕâ¸öÒ»Ê±ËøÊÇÎÞ·¨¿ªÊ͵쬣¬£¬ÈôÊÇÏëÒª»ú¹ØÒ»¸ö·ì϶ÀûÓû·¾³Ê×ÏȱØÒªÓÃһЩ²½ÖèÀ´ÈƹýËü¡£¡£¡£
´Ë¿ÌµÄÇé¿öÔì³ÉÁËÏÂͼËùʾ£º
µ±ÐÂÎÅΪHCBT_CREATEWNDʱ£¬£¬£¬ÎÒÃǵÚÒ»´Î´ïµ½xxxMNOpenHierarchyº¯ÊýÄÚ²¿µÄxxxCreateWindowEx¡£¡£¡£
ÕâÀïÄܹ»Í¨¹ý½ç˵¹ØÓÚHCBT_CREATEWNDÐÂÎŵĴ¦Öõõ½Ö´ÐÐÓû§²ã»Øµ÷´úÂëµÄ»úÓö£¬£¬£¬ÕâÒ»²½µÄÖØÒªÖ÷ÕÅÊÇΪÁË»ñÈ¡MenuµÄWnd¡£¡£¡£
µ±½Ó¹Üµ½µÄÐÂÎÅΪWM_ENTERIDLEʱ£¬£¬£¬ÎÒÃÇÔÚ´°¿ÚµÄÐÂÎŻص÷ÖÐͨ¹ýPostMessageÏ·¢ÐÂÎÅ¡£¡£¡£
·¢ËÍÐÂÎź󣬣¬£¬Çý¶¯·¨Ê½À´µ½ÁËxxxMNKeyDownº¯ÊýÄÚ²¿Å²ÓÃxxxSendMessage´¦¡£¡£¡£
ͨ¹ýWM_NEXTMENUÐÂÎŵĻص÷º¯ÊýÆðͷΪLPARAM¸³Öµ£¬£¬£¬¸³Öµ²Ù×÷ÊÇΪÁËÅú¸ÄhMenuµÄOwner£¬£¬£¬ÕâÑù¾ÍÄܹ»½«OwnerµÄÒ»Ê±ËøÈÆ¹ý¡£¡£¡£
´ËʱÄں˻á½Óµ½Ïú»ÙmenuµÄÐÂÎÅ£¬£¬£¬Í¨¹ýÓû§²ãµÄ»Øµ÷º¯Êý·µ»Ø1×èÖ¹menuµÄÏú»Ù¡£¡£¡£
xxxMNKeyDownº¯Êýͨ¹ýUnlockPopupMenu½«g_hMenuOwnerÉíÉϵÄÓÀÔ¶Ëø±»È¥µô¡£¡£¡£
È¡¶ø´úÖ®µÄÊÇg_hNewOwner¼ÓÉÏÁËÒ»¸öËø£¬£¬£¬hMenuµÄOwnerÒ²´Óg_hMenuOwnerÔì³ÉÁËg_hNewOwner¡£¡£¡£
Õâʱ£¬£¬£¬ËøµÄ¹ØÏµÔì³ÉÁË£º
½ÓÏÂÀ´·¨Ê½µÚ¶þ´Î½øÈëµ½xxxMNOpenHierarchyº¯Êý²¢Í¨¹ýxxxSendMessage·¢ËÍÁËÐÂÎÅ¡£¡£¡£
´Ëʱͨ¹ýÉèÖÃWM_INITMENUPOPUP»Øµ÷À´»ñµÃÓû§²ãÖ´ÐеĻúÓö£¬£¬£¬WM_INITMENUPOPUP»Øµ÷º¯Êýͨ¹ýSetWindowsHookExº¯ÊýÉèÖÃÁËÒ»¸öеÄhook£¬£¬£¬Ö÷ÕÅÊÇΪÁËÔÚxxxMnOpenHierarchyº¯Êý´´½¨×Ó´°¿ÚµÄʱ³½»ñµÃÓû§²ãÖ´ÐÐȨÏÞ¡£¡£¡£
xxxMnOpenHierarchyº¯Êý³ÖÐøÏòÏÂÖ´ÐУ¬£¬£¬ÔÙ´ÎÀ´µ½xxxCreateWindowEx´¦¡£¡£¡£
xxxCreateWindowExŲÓÃÁ˸ոÕÉèÖõĻص÷º¯ÊýchildMenuHookProc¡£¡£¡£
Ôڻص÷º¯ÊýchildMenuHookProcÖУ¬£¬£¬SendMessage·¢ËÍÁËWM_NEXTMENUÐÂÎÅ£¬£¬£¬Í¨¹ý¸Ã½ç˵¸ÃÐÂÎŵĻص÷º¯ÊýÔÙ´ÎÅú¸Ä²ÎÊýLPARAM£¬£¬£¬ÕâÊÇΪÁËÈ¥µôg_hNewOwnerÉíÉϵÄÓÀÔ¶Ëø¡£¡£¡£
MenuµÄOwner¹ØÏµÔٴα»Å¤×ª£¬£¬£¬xxxMNKeyDownͨ¹ýº¯ÊýUnlockPopMenuÈ¥µôg_hNewOwnerÉíÉϵÄÓÀÔ¶Ëø¡£¡£¡£²¢½«Õâ¸öËøÖØÐ¼ÓÔÚÁËg_hMenuOwnerÉÏ¡£¡£¡£
Õâ¸öʱ³½£¬£¬£¬ËùÓеÄËø¶¼ÒÑ¾×ªÒÆµ½ÁËg_hMenuOwnerÉíÉÏ£¬£¬£¬¶øÓÉÓÚWH_CBT¹³×ÓÒѾ±»ÒƳý£¬£¬£¬menu½«±»ÆúÓ㬣¬£¬g_hNewOwner½«°Ñд´½¨µÄ´°¿Úlinkµ½×Ô¼ºÉíÉÏ¡£¡£¡£Õâ¸öʱ³½Çé¿öÔì³ÉÁËÏÂÃæµÄÑù×Ó£¬£¬£¬g_hNewOwnerÉíÉÏÒѾûÓбØÒªÈƹýµÄËøÁË¡£¡£¡£
½Ó×ÅchildMenuHookProcͨ¹ýSetWindowsHookExº¯ÊýÓÖÒ»´ÎÉèÖÃÁ˻ص÷º¯Êý²¢Í¨¹ýSetWindowLongPtrº¯ÊýÀ´Å²ÓÃËü£¬£¬£¬»Øµ÷º¯ÊýÏú»ÙÁËg_hNewOwnerºÍxxxCreateWindowExÌìÉúµÄд°¿Ú¡£¡£¡£
xxxCreateWindowEx·µ»ØµÄֵΪffff871b80239130£¬£¬£¬Õâ¾ÍÊÇxxxCreateWindowEx´´½¨µÄ×Ó´°¿Ú¡£¡£¡£
½ÓÏÂÀ´¾ÍÄܹ»Í¨¹ýThreadUnlockÀ´Ïú»Ùg_hNewOwnerºÍÆäд´½¨µÄ×Ó´°¿ÚÀ´µÃµ½Ò»¸öUAF·ì϶¡£¡£¡£
ËÄ¡¢¡¢¡¢×Ü ½á
±¾ÎĶÔwin32k·ì϶ÍÚ¾òÐÂ˼·½øÐÐÁ˾ßÌå½â¶Á£¬£¬£¬ÆäÖÐÔ̺¬½«unlockº¯ÊýºÍ¶ÔÏóµÄDestroyº¯ÊýµÄ¸öÐÔ¹ØÁªÔÚһ·£¬£¬£¬²¢°Ñ¶ÔÏóµÄ×Ó×ÊÔ´×÷Ϊ¹¥»÷Ö¸±êѰÕÒÐµĹ¥»÷ÃæµÄ·ì϶ÍÚ¾ò˼·¡£¡£¡£±ðµÄ£¬£¬£¬ÈôºÎͨ¹ý¶ÔÏóÄÚ²¿µÄ¸öÐÔÈ¥ÈÆ¹ýËø¶Ô¶ÔÏóµÄËø¶¨µÄ˼·ºÍ¼¼ÇÉ£¬£¬£¬Ò²¼«¶ÈÓµÓÐ½è¼øÒâ˼¡£¡£¡£


¾©¹«Íø°²±¸11010802024551ºÅ