[原创]CVE-2015-1805 iovyroot 查找内核地址
CVE-2015-1805 iovyroot 查找内核地址
1. 提取zImage
1.1 下载rom,找到boot.img
1.2. 使用unpackbootimg或者其他工具解压boot.img
unpackbootimg -i boot.img -o out
1.3. out目录下文件如下:
drwxrwxr-x 2 android android 4096 1月 6 17:45 . drwxrwxr-x 4 android android 4096 1月 6 17:45 .. -rw-rw-r-- 1 android android 9 1月 6 17:45 boot.img-base -rw-rw-r-- 1 android android 99 1月 6 17:45 boot.img-cmdline -rw-rw-r-- 1 android android 0 1月 6 17:45 boot.img-dt -rw-rw-r-- 1 android android 5 1月 6 17:45 boot.img-pagesize -rw-rw-r-- 1 android android 1969875 1月 6 17:45 boot.img-ramdisk.gz -rw-rw-r-- 1 android android 9 1月 6 17:45 boot.img-ramdisk_offset -rw-rw-r-- 1 android android 0 1月 6 17:45 boot.img-second -rw-rw-r-- 1 android android 9 1月 6 17:45 boot.img-second_offset -rw-rw-r-- 1 android android 9 1月 6 17:45 boot.img-tags_offset -rw-rw-r-- 1 android android 6097624 1月 6 17:45 boot.img-zImage
1.4. binwalk boot.img-zImage -e提取被gzip压缩的zImage
DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 15851 0x3DEB gzip compressed data, maximum compression, from Unix, NULL date (1970-01-01 00:00:00) binwalk会自动生成一个_boot.img-zImage.extracted目录,里面有个文件名为3DEB的文件,文件名为data的十六进制起始地址
2. 32位rom获取符号的内核地址
查看iovyroot源码中会知道有个offset结构体,可以看到32位的设备需要获取5个符号的地址
struct offsets {
char* devname; //ro.product.model
char* kernelver; // /proc/version
union {
void* fsync; //ptmx_fops -> fsync
void* check_flags; //ptmx_fops -> check_flags
};
#if (__LP64__)
void* joploc; //gadget location, see getroot.c
void* jopret; //return to setfl after check_flags() (fcntl.c), usually inlined in sys_fcntl
#endif
void* sidtab; //optional, for selinux contenxt
void* policydb; //optional, for selinux context
void* selinux_enabled;
void* selinux_enforcing;
};
分别为ptmx_fops, sidtab, policydb, selinux_enabled, selinux_enforcing
2.1 使用kallsymsprint可以获取以上5个符号的地址
kallsymsprint.x86是获取32位zImage的工具 kallsymsprint.x64是获取64位zImage的工具 $kallsymsprint.x86 3DEB | grep -E "ptmx_fops|sidtab|policydb|selinux_enabled|selinux_enforcing" [+]mmap mem=f67c0000 length=00d8c18c offset=c9848000 [+]kallsyms_addresses=c08e6030 count=000135d4 [+]kallsyms_num_syms=000135d4 [+]kallsyms_names=c0933790 [+]kallsyms_markers=c0a1f6b0 [+]kallsyms_token_table=c0a1fb90 [+]kallsyms_token_index=c0a1ff30 [+]kallsyms_lookup_name ... ... ... //这个地址是小米3的地址,我手里的测试机是小米2s,而小米2s的zImage使用kallsymsprint找不到这几个符号和地址 c0d2a184 selinux_enabled c0fe9640 selinux_enforcing c0feb0a0 policydb c0feb1a4 sidtab c0fefdd0 ptmx_fops ... ...
2.2 添加offset
把2.1获取的5个符号的地址和model,linux version按格式添加在offsets.c的offsets数组中即可。 在iovyroot根目录运行ndk-build编译即可。
2.3 使用kallsymsprint无法获取到5个符号的地址
上面我们已经讲到有些zImage使用kallsymsprint没法获取我们需要的符号地址,比如我的小米2s,那么怎么办呢? 别着急,祭出我们的大杀器IDA神器+源码引用(小米内核源码的地址见附录)
2.4 IDA加载32位的zImage

注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
复制成功
