美文网首页
十三 ASLR

十三 ASLR

作者: 当前明月 | 来源:发表于2020-06-12 12:36 被阅读0次
一 Mach-O文件内存分布
二 ASLR详解
三 实例演示ASLR的应用
一 Mach-O文件内存分布

我们平时开发调试应用程序很简单,就是利用Xcode进行断点


Xcode断点

但是在逆向工程中,你是不能这样调试别人的应用的,我们无法拿到别人的源代码,无法通过Xcode来调试.但是不要担心,我们可以通过LLDB这个工具来进行调试

breakpoint set -n "test"
断点调试

我们通过breakpoint命令来断点我们要调试的代码,但是这里我们要注意的是在调试别人的代码时我们无法通过方法名来进行断点的,我们只能通过方法地址来进行断点,如下:

breakpoint set -a 0x102227859

在这里方法的地址值我们通过逆向Mach-O文件就能看到,下面我就拿自己写的这个应用来演示一下,因为是自己的应用,我不用砸壳了,要是别人的应用你需要砸壳.

第一步 拿到我们应用的可执行文件
image.png 查看app包内容
第二步 把我们的可执行文件拖到hopper disassember里面去
查看函数地址
我们可以看到我们的函数地址是0x0000000100000dc0,那么是不是我们断点到这个地址就能断点到我们的test函数呢
breakpoint set -a 0000000100000dc0

执行断点的话不管成功还是不成功,我可以直接告诉你断点的位置都是不对的,因为我们的应用程序在载进内存的时候,系统都会添加一个偏移地址,这个偏移地址每次运行程序都是不一样的.你想一下如果地址都是死的,那还有什么安全可言,别人只要把可执行文件网Hopper一拖,就能看到你所有的函数地址,那不是想干什么就干什么了.具体这个偏移具体详情我们下小节讲,我们先来了解下mach-o文件的内存分布情况,把我们刚才的可执行文件拖到MachOView里面


我们先来讲解下红框四个字段的基本概念
VM Address:Virtual Memory Address,内存地址,在内存中的位置
VM size:Virtual Memory Size,内存大小,占多少内存
File Offset:在Mach-O文件中的位置
File Size:在Mach-O文件中占用的大小
__PAGEZERO
VM Address: 0
VM size:4294967296
File Offset:0
File Size:0
__PAGEZERO在Mach-O文件中占用的大小为零,但是在载进内存后,它的大小就不是为零了.

__Text
__TEXT
VM Address: 4294967296
VM size:12288 __DATA
__DATA
VM Address: 4294979584
VM size:12288
Mach-O已经描述好我们的代码段,数据段的内存地址以及内存大小,函数代码存放在__TEXT段中,我们函数存放地址都在__TEXT段中的
我们在来熟悉下Mach-O文件的整体结构

好了我们通过Mach-O文件已经知道我们写的函数存放的大致位置,那么在运行程序的时候载进内存时候,函数地址有什么变化呢,我们接下来看一下.
二 ASLR详解

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

2.1 未使用ASLR之前Mach-O文件内存分布情况
未使用ASLR之前Mach-O文件内存分布
函数代码存放在__TEXT段中
全局变量存放在__DATA段中
可执行文件的内存地址是0x0
__PAGEZERO大小:0
代码段(__TEXT)的内存地址就是LC_SEGMENT(__TEXT)中VM Address arm64:0x100000000(8个0)非arm64:0x4000(3个0)
2.2 使用ASLR之后Mach-O文件内存分布情况
使用ASLR之后Mach-O文件内存分布
LC_SEGMENT(__TEXT)的VM Address
0x100000000
ASLR随机产生的Offset(偏移)
0x5000
__PAGEZERO大小:100000000
原先Mach-O文件在装载进内存后各数据位置都发生了偏移,那我们函数内存地址就是(VM Address) = File Offset + ASLR Offset + __PAGEZERO Size
所以我们在断点别人的函数时,它的地址要通过(File Offset + ASLR Offset + __PAGEZERO Size)这三个地址相加来计算,这三个地址每次程序装载进内存,都要重新获取.
Hopper中显示的的地址都是未使用ASLR的VM Address 也就是说Hopper中显示的地址是:File Offset + __PAGEZERO Size,那么我们要断点一个函数的地址就简单了:
1 先看该函数在Hopper中的地址
2 查看该应用的ASLR Offset
3 两者相加

下面我们来演示一下.

三 实例演示ASLR的应用

为了方便我直接拿自己Xcode写的应用来演示,如果是调试别人的应用,你只要进入动态调试,就可以和我一样的操作了,首先我先进入调试模式

Xcode调试模式
这里我打算给test函数打个断点
把我们的可执行文件拖放到Hopper中我们先看下test函数的地址
Mach-o 函数地址
我们看到test函数地址是:0x0000000100000dc0
接下来我们再看ASLR Offset.
使用LLDB命令image list -o -f | grep runloop runloop是你应用的名字

这个打印出来的就是偏移地址:0x00000000082bd000
最后我们执行断点命令
breakpoint set -a 0x0000000100000dc0+0x00000000082bd000
断点

我们可以看到断点打成功了.


断点成功

我们过掉Xcode断点,发现代码会断点到test函数处了.

OK 今天就是我要讲的全部内容.动态调试别人的代码,总得知道别人的代码具体在内存中什么位置吧,学了今天的内容,相信对于你定位代码位置不再是难事了.

相关文章

  • 十三 ASLR

    一 Mach-O文件内存分布 二 ASLR详解 三 实例演示ASLR的应用 一 Mach-O文件内存分布 我们平时...

  • Mach-O地址

    ASLR1.1 什么是ASLR1.2 iOS4.3开始引入了ASLR技术 Mach-O的文件结构 未使用ASLR ...

  • iOS逆向-LLDB高级用法&Cycript-(ASLR)(Ⅷ)

    ASLR ASLR(Address Space Layout Randomization),地址空间布局随机化。是...

  • iOS逆向与安全5.2:LLDB进阶

    ASLR ASLR(Address space layout randomization)是一种针对缓冲区溢出的安...

  • ASLR

    概述 ASLR(Address space layout randomization)是一种针对缓冲区溢出的安全保...

  • ASLR

    操作系统的随机地址ASLR机制我们都了解,但是具体如何实现的,读了本片文章才了解到是通过基于基地址的随机偏移量完成...

  • IOS逆向_ASLR

    1. ASLR的简介; 2. 计算APP中一段代码的真实内存地址; 1. ASLR的简介; 1.1 ASL...

  • ASLR绕过

    0x00 覆盖部分地址绕过ASLR 这一类绕过方法不仅是覆盖部分返回地址,还包括结合uaf等等进行利用,2016h...

  • 十八、 ASLR

    一、代码断点的注意点 给脱壳的Mach-O文件打断点时,不能用函数名来打断点,要用函数地址来断点,并且加上地址偏移...

  • ASLR bypass

    ASLR负责堆、栈、LIBC加载基址随机化。 PIE负责代码段(.code)、数据段(.data/.bss)加载基...

网友评论

      本文标题:十三 ASLR

      本文链接:https://www.haomeiwen.com/subject/lcsppqtx.html