破解某基于MTK芯片的通讯终端

中移动定制终端,具体型号隐去。开机只有定制的APP,无法安装apk,通过开发者模式也不行。adb install XXX.apk  显示“禁止安装第三方应用”。

一、信息收集:

1.可以进开发者模式,adb shell 是普通用户$,没有root权限。

2.无法安装apk,通过开发者模式也不行。adb install XXX.apk  显示“禁止安装第三方应用”。

3.经测试,data/local/tmp 目录可读可写可执行(Android系统均如此),用ndk 编译了一个二进制程序,上传至该目录,可以在 shell 中执行

4.开一个命令行,列出所有安装的apk:

adb shell pm list packages

从以上回显中找到想要的APK,记下包名(例如 com.android.abc ),然后查找该apk的路径:

adb shell pm path com.android.abc

这里就回显出包名所在路径了(/data/app/com.android.abc-1.apk)。然后pull 到本地(命名为abc.apk):

adb pull /data/app/com.android.abc-1.apk     abc.apk 

二、漏洞利用提升权限,dump出系统镜像

这里利用了一个漏洞,(CVE-2020-0069),通过mtk-su实现获取联发科设备Root权限:

adb push  d:mtk-su  data/local/tmp
adb shell ./data/local/tmp/mtk-su

会返回一个root权限的shell,df命令查看各分区情况:

ZhongDuanSheBei:/ $ df
Filesystem            1K-blocks   Used Available Use% Mounted on
tmpfs                    470612    620    469992   1% /dev
/dev/block/mmcblk0p31   1515376 788544    694720  54% /system
/dev/block/mmcblk0p30    483528 184024    284024  40% /vendor
tmpfs                    470612      0    470612   0% /mnt
/dev/block/mmcblk0p33   4970476 142324   4533240   4% /data
/dev/block/mmcblk0p32    189920    484    183052   1% /cache
/dev/block/mmcblk0p9       3824     76      3508   3% /vendor/protect_f
/dev/block/mmcblk0p10      5280     76      4916   2% /vendor/protect_s
/dev/block/mmcblk0p7      27632   2928     23728  11% /vendor/nvdata
/dev/block/mmcblk0p6       3824     48      3536   2% /vendor/nvcfg
/data/media             4970476 142324   4533240   4% /storage/emulated

由上可知:

boot分区(Linux内核)         ->   /dev/block/mmcblk0p25
recovery分区 (Recovery恢复)     ->   /dev/block/mmcblk0p2
system分区(Android系统框架及应用)    ->   /dev/block/mmcblk0p31

然后将以上分区分别提取到手机的内置存储中,以boot分区为例:

dd if=/dev/block/mmcblk0p25 of=/sdcard/boot.img

这样 boot.img 就放到了sdcard,使用

adb pull /sdcard/boot.img

将 boot.img   recovery.img   system.img 分别 pull 到电脑中.

三、修改镜像:

以 system.img 为例,

先用file命令查看system.img的文件类型

 

file system.img

显示如下:

 

 system.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (needs journal recovery) (extents) (large files)

 

说明是 ext4 filesystem data,可以采用挂载分区的方式来打开system.img文件:

 

mount -t ext4 -o loop system.img  system_img    //此命令的意思将system.img镜像文件挂载到同级别下的system_img目录
cd system_img    //此时这个目录里面就是system 镜像的内容,切到这个目录进行修改即可。比如更换apk,增加superSU 和 bin/su 以获得root等

然后用 make_ext4fs 这个工具对 system_img 修改后的镜像文件进行打包:

./make_ext4fs -l 1536M -s -a system system_new.img system_img

参数解析:1536M代表你要打包的system.img大小,这个值等于挂载前 的那个system.img 的大小,也可写成字节数,我的 system.img 是 1,610,612,736 字节,除以1024是 1572864 K ,再除以1024 是1536M 

"-a system",是指这个img用于android系统,挂载点是/system,使用这个参数,make_ext4fs会根据private/android_filesystem_config.h里定义好的权限来给文件夹里的所有文件重新设置权限,如果你刷机以后发现有文件权限不对,可以手工修改android_filesystem_config.h来添加权限,重新编译make_ext4fs,也可以不使用 “-a system”参数,这样就会使用文件的默认权限。system_new.img 代表新生成的img, system_img 就是上面挂载后的目录.

一般很多人认为这样生成的system_new.img就可以用了,其实不然.再次用file命令查看文件类型:

file system_new.img

显示如下:

system_new.img: data

跟之前的输出截然不同,这显然不是ext4文件类型。这里继续使用 simg2img 工具将其转换成真正的ext4文件:

./simg2img system_new.img system_out.img

得到system_out.img,我们再“file system_out.img”看一下:

system_out.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)。

这就和最初的system.img一样的格式了。

四、将修改后的镜像写入设备中:

首先要解锁,不然受到保护,无法写入:

adb reboot bootloader  //重启进入fastboot 
fastboot oem unlock  //解锁BL

此时有提示,按提示解锁后手机会重启,并清空所有内容!然后将新镜像 system_out.img 写入手机system分区:

fastboot flash system system_out.img

待所有进度完成,“fastboot reboot ” 重启手机即可。

 -------------------------------------------------------------------------------------

附:文中提到的程序下载地址

make_ext4fs:https://blog.cofface.com/archives/2681.html

simg2img   :https://blog.csdn.net/u010285974/article/details/105268744

参考资料:

https://blog.csdn.net/zhangbijun1230/article/details/80864263

https://www.52pojie.cn/thread-1123037-1-1.html

原文地址:https://www.cnblogs.com/codex/p/13974904.html