iOS应用安全Part39:获取内存中的敏感信息

【说明】英文原文发表时间:2015.3.17,原文链接:点击这里

前言

在本篇博文中,我们将着手分析一个iOS应用内存中的内容。iOS应用的内存中可能存留有像密码、会话ID等之类的敏感信息。在某些情况下,可能无法选择性地释放这些变量。例如,应用程序可能需要为每个请求发送一个认证令牌,所以在内存中的某个地方肯定存在着对它的引用。尽管这些变量可能经过加密之后才存储在应用程序本地,不过程序运行时这些变量的值将以解密状态存在。因此,在对一个iOS应用进行渗透测试时,分析内存中的内容将是一件非常重要的事。同时提醒应用开发者,如果有一些重要的属性或实例变量不再需要,那么应该及时将它们从内存中释放掉。

0x01 明确目标

基本上,应用程序的内存中包含大量的信息,不过其中的大部分信息我们不感兴趣,这些内容可能包括实例化的UIViews以及其他UI元素,但是我们肯定会对实例化的视图控制器及它们的属性感兴趣。重要的是要理解并只专注于内存中相关的信息。作为一个渗透测试人员,你感兴趣的主要内容应该是应用中所有属性值和实例变量值。

我们将解决内存中敏感信息的挑战,示例应用是Damn Vulnerable iOS应用


第一个挑战就是要找到名为“用户名”和“密码”的属性。要做到这一点,首先我们必须得到当前视图控制器的引用。从应用的class-dump输出中很容易找出,这个视图控制器的类名是SensitiveInformationDetailsVC。接着,我们可以使用cycript中的choose函数来找到这个类的对象引用,其中choose函数以一个Objective-C类作为输入参数,并试图通过搜索堆来寻找与你指定的类(或者该类的任何子类)大小和结构相同的内存区域。所以基本上,它会找到你指定的类或子类的所有对象引用。

0x02 获取关键信息

因此,下一步就是找到SensitiveInformationDetailsVC类的实例,我们使用choose函数,并以该类名作为参数。


正如我们所看到的,只有一个该类的引用,接着可以使用索引0来访问它。

为了找出所有属性,使用命令a[0]- > isa.messages。


现在,您可以扫描输出来找到所有感兴趣的属性名字。因为我们已经知道了目标属性名称,即用户名和密码,那么我们就可以直接使用如下所示的命令来访问它们。


就是这么简单。
接下来,我们需要找到一些实例变量。为此,我们需要定义一个函数,它将打印特定实例的所有实例变量。
tryPrintIvars(a){ var x={}; for(i in *a){ try{ x[i] = (*a)[i]; } catch(e){} } return x; }

现在,可以将类SensitiveInformationDetailsVC的实例作为该函数的输入,就可以看到它打印出了所有的实例变量以及它们的值。


0x03 深入分析

然而,我们并没找到名为“passwd”的实例变量。怎么回事?原来是这里的问题。实例变量的问题是,它们可以在一个特定的方法中被初始化,所以如果该方法未被调用,那么实例变量就不会被初始化。同时,由于iOS中的ARC(自动引用计数)特性,一旦初始化变量的方法停止运行,那么该变量将被自动释放掉。在某些情况下,你可能无法通过手动浏览应用程序来调用一个方法,不过这也正是cycript大有用武之地。回到这个类的方法,我们可以看到,有一个名为“initializeLogin”的方法。而且,除了iOS中常规的方法例如viewDidLoad和didReceiveMemoryWarning之外,“initializeLogin”在应用中唯一,所以在该方法中创建实例变量是安全的。

一旦我们调用了方法initializeLogin,实例变量将会被初始化并存储在应用的内存中。这里的一个技巧是,在运行时使用GDB分析应用程序内容,并在该方法停止执行之前找到该变量的值。我将把这种方法作为练习留给你。不过,为了方便起见,下面给出了initializeLogin方法的源代码。
-(void)initializeLogin {
    //DO random stuff
    NSString *passwd = @"MYw0r1d1821";
    //Finish doing random stuff
}
关于dump应用的堆内存,Mark Beard已经写了一篇很不错的文章,同时也发布了一个工具,建议你看看 这篇文章
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值