Android ARM32 ROP level8学习笔记

首先Android上的ASLR是伪ASLR,因为所有程序都是由zygote fork出来的,因此系统中的所有library的基址都是相同的,并且和zygote的内存布局一样,可以通过cat /proc/xxx/maps得到证实:

因此只要在自己的APP上得到libc.so的地址,同样也就可以知道其他APP的libc.so的基址了。
level8.c代码:

这个程序会先输出system的地址,相当于我们已经获取了这个进程的内存布局,接下来我们可以通过ROPgadget从libc.so中寻找我们需要的gadget地址,因为libc.so文件足够的大,因此我们完全不用担心找不到需要的gadgets,但是很奇怪,我第一次用ROPgadget将gadget地址保存至txt文件中,只有很少量的可用地址,因为这个问题,导致我在这里卡了2、3个小时,@_@

其中348a2这个地址是与教程上的34ace一致的,因此,只要再将/system/bin/sh的地址确认即可。

虽然知道了gadget和/system/bin/sh的地址,我们依然需要根据system在内存中的地址进行偏移量的计算才能够成功的找到gadgets和”/system/bin/sh”在内存中的地址,另外这里还需要留意一下thumb和arm指令转换的问题,最终的exp.py如下:

如果要使用2e188这个地址的话,需要增加0xc个”\x00″,具体计算方式:0x4*(R2+R3+R4+R5+R6)-0x4-0x4(R0)=0xc
执行结果:

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据