博客
关于我
IOS逆向-ASLR
阅读量:736 次
发布时间:2019-03-21

本文共 1419 字,大约阅读时间需要 4 分钟。

IOS逆向-ASLR

在逆向中我们无法使用breakpoint set -n "-[xxxxx xxxx:]"的方式(通过类名和方法名)来打断点,这种方式适合在Xcode工具中使用, 在逆向中我们一般使用breakpoint set -a 地址来打断点 ,通过函数的内存地址来打断点

那么我们如何找到正确的函数地址了?

1. Mach-O文件分析

首先我们知道Mach-O的文件结构:在这里插入图片描述

我们可以使用MachoView来分析下Mach-O文件的结构:在这里插入图片描述

  • VM Addreess: Virtural Memeory Address内存地址,在内存中的大小
  • VM SIze:Virtural Memeory Address内存大小,占用内存多少
  • _PAGEZERO、_TEXT、_DATA、_LINKENIF 的内存地址和内存大小都可以通过Mach-O文件
  • File Offset:在Mach-O文件中的位置
  • File Size: 在Mach-O文件中占据的大小

首先我们观察Mach-O文件,我们发现_PAGEZEROMach-O文件中是不存在的, 在内存中确是存在的

未使用ASLR的Mach-O文件加载到内存中的过程图:

在这里插入图片描述

  • 函数代码存放在_TEXT(_text)段中
  • 全局变量存放在_DATA断中
  • 可执行文件的内存地址是0x0
  • 代码段(_TEXT)的内存地址
    • 就是LC_SEGMENT(_TEXT)中的VM Address
    • arm64: 0x100000000(8个0)
    • 非arm64:0x4000(3个0)
  • 可以使用size -l -m -x来查看Mach-O的内存分布

2. ASLR

2.1 什么是ASLR

  • Address Space Layout Randomization,地址空间布局随机化
  • 是一种针对缓冲区溢出的安全保护技术,通过对堆、栈共享库映射等线性布局的随机化,通过增加攻击者预测目的地的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击目的的一种技术
  • IOS4.3开始引入的ASLR技术

2.2 获取函数的真实地址

  • 函数的内存地址(VM Address)= File Offset + ASLR Offset + _PAGEZERO
  • HopperIDA中的地址都是未使用ASLR的VM Address
  • 使用了ASLR技术的Mach-O加载进内存的过程:在这里插入图片描述

我们在程序中编写的函数,全局变量,程序一旦编译,函数和变量的位置就固定了,文件的偏移是固定的

我使用debugserver链接上手机查看微信Mach-O文件载进内存的地址,这样我们就可以获取函数真正的内存地址了,通过image list -o -f 查看模块信息,Mach-O文件本身也是一个模块在这里插入图片描述

  • 由上图可知,微信加载进内存的地址是什么,然后减去arm64架构固定长度(0x100000000),就得到ASLR技术造成的地址偏移量,然后我们在分析工具中看到的函数地址加上这个偏移量,就得到了函数在内存中真正的地址,这样我们就可以使用LLDB命令通过函数地址来打断点

虚拟内存的分配 :dyld(动态库加载器) --> Mach-O文件(当前app的可执行文件) ---> 依赖的其他动态库(比如系统的UIKit等) ---> 栈空间、堆控件

3. 答疑

  • _PAGEZERO的作用?
    • obj = NULL:NULL指针,其实就是指向_PAGEZERO安全区域

转载地址:http://xxrgz.baihongyu.com/

你可能感兴趣的文章
Mysql学习总结(32)——MySQL分页技术详解
查看>>
Mysql学习总结(33)——阿里云centos配置MySQL主从复制
查看>>
Mysql学习总结(35)——Mysql两千万数据优化及迁移
查看>>
Mysql学习总结(36)——Mysql查询优化
查看>>
Mysql学习总结(37)——Mysql Limit 分页查询优化
查看>>
Mysql学习总结(38)——21条MySql性能优化经验
查看>>
Mysql学习总结(39)——49条MySql语句优化技巧
查看>>
Mysql学习总结(3)——MySql语句大全:创建、授权、查询、修改等
查看>>
Mysql学习总结(40)——MySql之Select用法汇总
查看>>
Mysql学习总结(41)——MySql数据库基本语句再体会
查看>>
Mysql学习总结(42)——MySql常用脚本大全
查看>>
Mysql学习总结(43)——MySQL主从复制详细配置
查看>>
Mysql学习总结(44)——Linux下如何实现mysql数据库每天自动备份定时备份
查看>>
Mysql学习总结(45)——Mysql视图和事务
查看>>
Mysql学习总结(46)——8种常被忽视的SQL错误用法
查看>>
Mysql学习总结(48)——MySql的日志与备份还原
查看>>
Mysql学习总结(49)——从开发规范、选型、拆分到减压
查看>>
Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
查看>>
Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
查看>>
Mysql学习总结(51)——Linux主机Mysql数据库自动备份
查看>>