欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]CVE-2015-1805 iovyroot 查找内核地址

[原创]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。

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

0 0 0 举报
复制成功