Use After Free

UAF 就是 Use After Free的缩写,是一种比较常见的内存错误式利用。很多iOS的越狱都是利用的这种方法。
在此简单的举个例子说明UAF出现的情况

代码说明一切

  class Car
{
public:
virtual void setValue(int value)=;
virtual int getValue()=; protected:
int mValue;
}; class Electric_car: public Car
{
public:
void setValue(int value){
mValue = value;
} int getValue(){
mValue += ;
cout<<"This is Electric_car's getValue"<<endl;
return mValue;
}
}; class Fuel_car : public Car
{
public:
void setValue(int value){
mValue = value;
}
int getValue(){
cout<<"This is Fuel_car's getValue"<<endl;
mValue += ;
return mValue;
}
}; void handleObject(Car* car)
{
car->setValue();
cout<<car->getValue()<<endl;
}

这个程序有三个类,其中Fuel_car和Electric_car都是继承自Car。并且分别实现了Car类的虚函数。因此当程序调用handleObject这个函数的时候,无论出入的参数是Electric_car还是Fuel_car,handleObject函数都可以正常被调用。

接着我们来看一下主函数的情况

     int main(void) {
Electric_car *myElectric_car = new Electric_car();
printf("Electric_car=%p\n",myElectric_car); handleObject(myElectric_car); free(myElectric_car); Fuel_car *myFuel_car = new Fuel_car();
printf("Fuel_car=%p\n",myFuel_car); handleObject(c);
}
  1. 我们先new一个Electric_car,然后再调用handleObject来打印它的value值。最后释放掉这个Electric_car。
  2. 接着,我们new一个Fuel_car,然后调用handleObject来打印Electric_car(请注意是Electric_car,不是Fuel_car)

按照以上的步骤调用了相关函数之后会发生什么情况呢,正常情况下会出现内存泄漏的报错。但是上面主函数只是free掉了myElectric_car,并且没有把指针也置为NULL。这个时候如果有另一个对象(比如上面的Fuel_car)刚好被分配到了myElectric_car的指针地址里面。handleObject就会对这个对象进行处理并且不会出现错误。这就是典型的UAF错误

简单看一下运行结果吧。

     myElectric_car=0x15b23a76
This is Electric_car's getValue myFuel_car=0x15b23a76
This is Fuel_car's getValue

可以看到Electric_car对象在内存中的地址为0x15b23a76,然后Electric_car就被free掉了。随后,程序又创建了另一个对象myFuel_car。因为堆的特性,系统会把刚刚free掉的内存再分配给myFuel_car。因此myFuel_car在内存中的地址也是0x15b23a76。所以当程序调用handleObject(myElectric_car)的时候,本应该期待调用Electric_car's getValue()函数却调用了Fuel_car's getValue()函数,这就造成一个UAF错误。

总结

以上就是对UAF错误发生原因的介绍,对应方法一般为释放内存之后还要记得把指针也释放掉。 提一个有意思的话题,在iOS9.0中,有人就用这个UAF错误实现了越狱。主要漏洞发生的函数是IOHIDResourceUserClient。 你能找出问题吗(同学们这是一道送分题啊)

    //----------------------------------------------------------------------------
// IOHIDResourceDeviceUserClient::terminateDevice
//----------------------------------------------------------------------------
IOReturn IOHIDResourceDeviceUserClient::terminateDevice()
{
if (_device) {
_device->terminate();
}
OSSafeRelease(_device); return kIOReturnSuccess;
}

UAF漏洞--iOS是越狱原理的更多相关文章

  1. exim CVE-2017-16943 uaf漏洞分析

    前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 这是最近爆出来的 exim 的一个 uaf 漏洞,可以进行远程代码 ...

  2. UAF漏洞学习

    产生原因: UAF漏洞的成因是一块堆内存被释放了之后又被使用.又被使用指的是:指针存在(悬垂指针被引用).这个引用的结果是不可预测的,因为不知道会发生什么.由于大多数的堆内存其实都是C++对象,所以利 ...

  3. iOS 应用签名原理&重签名

    在苹果的日常开发中,真机测试与打包等很多流程都会牵扯到各种证书,CertificateSigningRequest,p12等.但是很多相应的开发者并不理解iOS App应用签名的原理和流程.今天着重讲 ...

  4. CVE-2013-3346:十全九美的 Adobe Reader ToolButton UAF 漏洞

    0x01 "Epic Turla" 网络间谍行动 在 2014 年 8 月,被誉为 "世界十大最危险的网络攻击行动" 之一的 "Epic Turla& ...

  5. CVE-2013-1347:从入门到放弃之调试分析令人崩溃的 Microsoft IE CGenericElement UAF 漏洞

    0x01 2013 年 "水坑" APT 攻击事件 在 2013 年 5 月,美国的劳工部网站被黑,利用的正是 CVE-2013-1347 这个漏洞,在当时导致大量使用 IE8 访 ...

  6. PWN——uaf漏洞学习

    PWN--uaf漏洞 1.uaf漏洞原理 在C语言中,我们通过malloc族函数进行堆块的分配,用free()函数进行堆块的释放.在释放堆块的过程中,如果没有将释放的堆块置空,这时候,就有可能出现us ...

  7. iOS程序启动原理---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  8. iOS应用启动原理图解 及ARC强弱引用

    iOS应用启动原理图解(红色箭头表示strong强引用,绿色箭头代表weak若引用) 只要将UI控件拖到Storyboard里控制器的大view上,Xcode会自动将这些控件以强引用的形式加入到sel ...

  9. iOS Category实现原理 (补充)

    iOS Category实现原理 (补充) load 和 initialize load load方法会在程序启动就会调用,当装载类信息的时候就会调用. 调用顺序看一下源代码.在 objc-loadm ...

随机推荐

  1. asp.net gridview 绑定图片字段,图片不显示

    在浏览器中查看,图片属性. 右键查看,若后面出现若干%20 可使用以下办法解决. 备份表数据,然后删除表,把图片路径字符串在数据库中应使用varchar()类型. 原因可以查看vchar()  var ...

  2. Provider Communication with Apple Push Notification Service

    This chapter describes the interfaces that providers use for communication with Apple Push Notificat ...

  3. [转载]MongoDB开发学习(2)索引的基本操作

    索引能够极大的提高查询的效率.在数据库中简历索引必不可少. 在MongoDB中可以很轻松的创建索引. 默认索引_id_ 开启MongoDB服务器,创建数据库cnblogs,创建集合Users .(关于 ...

  4. 1182-IP地址转换

    描述 给定一个点分十进制的IP地址,把这个IP地址转换为二进制形式. 输入 输入只有一行,一个点分十进制的IP地址 包括四个正整数,用三个.分开,形式为a.b.c.d 其中0<=a,b,c,d& ...

  5. CF 279A. Point on Spiral

    http://codeforces.com/problemset/problem/279/A 题意 :就是给你一个螺旋形的图,然后给你一个点,问从(0,0)点到这个点需要转几次弯,当然,是按着这个螺旋 ...

  6. ASP.NET MVC 入门3、Routing

    本系列文章基于Microsoft ASP.NET MVC Beta. 在一个route中,通过在大括号中放一个占位符来定义( { and } ).当解析URL的时候,符号"/"和& ...

  7. Android 动态背景的实现以及SurfaceView中添加EditText控件

    首先还是一贯作风,我们先看案例: \ 静态图看不出来效果,如果用过此软件(扎客)的同学们都知道,她的背景会动.怎么样,是不是觉得很时尚,起码比静态的要好(个人观点).其实实现起来并不复杂,这个如果让做 ...

  8. JNI编程(二) —— 让C++和Java相互调用(1)

    自己在外面偷偷的算了下,又有将近两个月没更新过blog了.趁着今天有兴致,来更新JNI编程的第二篇文章.在第一篇里,大概介绍了JNI的特点.用途和优劣.并且做一个最简单的JNI的例子,不过说实话那个例 ...

  9. ActionBar官方教程(11)自定义ActionBar的样式(含重要的样式属性表及练习示例)

    Styling the Action Bar If you want to implement a visual design that represents your app's brand, th ...

  10. Android 内核初识(6)SystemServer进程

    简介 SystemServer的进程名实际上叫做“system_server”,通常简称为SS. 系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms).ActivityM ...