Android ARM 32 ROP学习&爬坑记

一、首先编写level6.c文件,代码如下:

二、使用arm-linux-gcc编译,开始使用的是win10自带的ubuntu16.04编译,发现死活安装不了arm-linux-gcc的交叉编译环境,各种报错(坑)。最后果断用了自己的Centos虚拟机,妥妥的一次OK(编译时这里有个坑,开始没有使用-static参数编译,发现编译后的level6执行时提示错误):

三、需要使用socat这个神器,但是android的LINUX上没有该工具,于是又是一番Google(继续跳坑),找到一个android下使用的socat,另外还有两个神器,一起打包的下载地址:

打包下载

四、将socat和level6一起push到/data/local/tmp目录中:

五、运行socat,然后开启端口映射:

六、nc连一下看看是否OK:

出现Hello,World,就表示OK了。

七、为了确定溢出点位置,用pattern.py来生成一些测试的字符:

八、然后写一个py脚本来发送这串字符串:

然后在手机上运行#./socat TCP4-LISTEN:10001,fork EXEC:./level6,启动监听,因为需要获取崩溃时的pc值,所以在发送数据前,需要先使用gdb加载上level6,先在电脑上运行python脚本:

然后然后在adb shell中用ps获取level6的pid,然后再挂载level6,然后用c继续:

然后在电脑上输入回车,让脚本发送数据。就可以在gdb里看到崩溃的pc的值了:

因为编译的level6默认是thumb模式,所以要在这个崩溃的地址上加个1:0x41346540+1 = 0x41346541。然后用pattern.py计算一下溢出点的位置:

OK,知道了溢出点的位置,我们就找返回的地址了,利用的代码在程序中已经写明。我们只要将pc指向callsystem()这个函数地址即可。我们在ida中可以看到地址为0x00008554(我这里看到的却是另一个地址)。

九、编写exp.py脚本:

依然先在手机上运行#./socat TCP4-LISTEN:10001,fork EXEC:./level6,然后运行脚本(很奇怪,我这里输入/system/bin/id,无任何回显,不知为何):

看到评论中有网友提到:

如果编译时开了PIE,导致所有ELF文件的代码段虚地址也随机化是否就无法绕过呢?现在新版本的Android都强制开启PIE,感觉很难利用了。

难道跟这个有关?

发表评论

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.