美文网首页
demo解说ASLR

demo解说ASLR

作者: coder_feng | 来源:发表于2020-05-02 22:54 被阅读0次

demo解说ASLR

下面是我的demo例子代码

ViewController.m


int a = 10;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)testASLR:(NSString *)text{
    a = 20;
    NSLog(@"测试ASLR的%@",text);
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self testASLR:@"demo"];
}

编译过后,获取该demo二进制文件,然后放到Hooper中分析,如下效果图 Snip20200502_36.png
这里我们以这个 -[ViewController testASLR:] 方法做测试案例,这里假设我想在这里打一个断点,从hooper可以看到0000000100006538是这个方法的内存地址,在Xcode的终端上面,我们通过命令行设置一个断点,如下图
(lldb) b  0x100006538
Breakpoint 2: no locations (pending).
WARNING:  Unable to resolve breakpoint to any actual locations.
(lldb) b list
Breakpoint 3: where = CoreGraphics`std::__1::list<CG::Chunk, CG::Allocator<CG::Chunk> >::list(std::__1::list<CG::Chunk, CG::Allocator<CG::Chunk> > const&), address = 0x0000000184ede2c8

点击屏幕测试

2020-05-02 22:19:36.408 ASLR说明Demo[5376:1565220] 测试ASLR的demo

发现断点并没有生效,这个是为什么呢?是因为iOS中有ASLR的概念,而我们在hooper中得到的是没有加上ASLR的,所以也并不是我们真正的函数内存地址,所以断点并没有生效,所以我们需要对真正的函数地址设置断点,这样才会生效的,因此我们需要获取ASLR的地址

获取ASLR

(lldb) image list
[  0] 15280D12-8A2C-3A40-BFAD-CCC7413FA577 0x000000010000c000 /Users/forest/Library/Developer/Xcode/DerivedData/ASLR说明Demo-aetozzfnbbhtyhasrrwqqvoajtgp/Build/Products/Debug-iphoneos/ASLR说明Demo.app/ASLR说明Demo 
  • 0x000000010000c000 这个地址是mach-o,加进去内存地址时候的真正地址,而mach-o加载进去虚拟内存地址的时候,是会首先有一个vmaddress的一个概念的,我们可以通过machView 这个工具查看 Snip20200502_39.png

    所以ASLR地址 = 0x000000010000c000 - 0000000100000000 = 0xC000;
    这个时候我们就可以直接计算函数的真正内存地址

函数的真正内存地址 = ASLR + mach-o 基址 + 函数的偏移地址
但是将二进制拖拽进去hooper的时候,显示的方法地址已经是mach-o基址 + 函数的偏移地址,所以这个时候改函数的真正内存地址 = 0xC000 + 0000000100006538 = 0x100012538

对真正地址设置断点

(lldb) b 0x100012538
Breakpoint 10: where = ASLR说明Demo`-[ViewController testASLR:] at ViewController.m:24, address = 0x0000000100012538

点击屏幕测试[图片上传失败...(image-f71d86-1588430338068)]
可以看到这个时候断点调试成功,到这里应该会对ASLR有一定的基础概念了吧,现在我们再来看看全局属性的获取,在代码中我们可以看到我们有一个a的变量,那么这个变量存放在哪个地址断呢?
从xcode中的终端打印出a的内存地址

(lldb) p a
(int) $6 = 20
(lldb) p &a
(int *) $7 = 0x0000000100014e30

这里如果我们需要去MachOView中寻找a变量的存放处,同样需要减去ASLR地址和vmaddress的地址值,这个值可以从前面得到的ASLR地址和vmaddress去计算或者直接从image list 获取到的第一个地址值直接减去这个值也可以

MachOView-a的内存 = 0x0000000100014e30 - (image list)函数的第一个地址0x000000010000c000
或者
MachOView-a的内存 = 0x0000000100014e30 - 0x100000000 - 0xC000
最后计算得出MachOView-a的内存 = 0x8E30 Snip20200502_41.png

相关文章

  • demo解说ASLR

    demo解说ASLR 下面是我的demo例子代码 ViewController.m 编译过后,获取该demo二进制...

  • 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机制我们都了解,但是具体如何实现的,读了本片文章才了解到是通过基于基地址的随机偏移量完成...

  • 十三 ASLR

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

  • IOS逆向_ASLR

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

  • ASLR绕过

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

  • 十八、 ASLR

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

网友评论

      本文标题:demo解说ASLR

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