背景

CVE-2013-2597 是高通 msm_acdb 设备驱动的一个 copy_from_user 栈溢出,利用要用到ROP。f101的漏洞利用介绍中,用到几处Gadgets,显然要根据acdb_ioctl的栈布局进行构造。

一个.ko模块加载到内核后,如何在内核中找到其对应汇编代码,一直比较迷惑,此文解决这个问题。

参考

  1. http://blog.csdn.net/py_panyu/article/details/45114545 少仲博客
  2. http://blog.csdn.net/hu3167343/article/details/45507999 如果找不到boot的分区,参考莫灰灰博客(后来发现,这其实在《Android安全攻防权威指南》里的。)

操作

以下在Nexus 5设备操作。

1)查看boot所有分区

root@hammerhead:/ # ls -l /dev/block/platform/msm_sdcc.1/by-name |grep boot
lrwxrwxrwx root root 1970-02-12 17:31 aboot -> /dev/block/mmcblk0p6
lrwxrwxrwx root root 1970-02-12 17:31 abootb -> /dev/block/mmcblk0p11
lrwxrwxrwx root root 1970-02-12 17:31 boot -> /dev/block/mmcblk0p19
root@hammerhead:/ #

2)dump出boot.img

root@hammerhead:/ # dd if=/dev/block/mmcblk0p19 of=/data/local/tmp/boot.img
45056+0 records in
45056+0 records out
23068672 bytes transferred in 0.827 secs (27894403 bytes/sec)
root@hammerhead:/ #

简单验证一下dump出的boot.img文件:

root@hammerhead:/ # busybox hexdump -C -n 200 /data/local/tmp/boot.img
busybox hexdump -C -n 200 /data/local/tmp/boot.img
00000000 41 4e 44 52 4f 49 44 21 20 41 80 00 00 80 00 00 |ANDROID! A......|
00000010 30 9d 07 00 00 00 90 02 00 00 00 00 00 00 f0 00 |0...............|
00000020 00 00 70 02 00 08 00 00 00 00 00 00 00 00 00 00 |..p.............|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 63 6f 6e 73 6f 6c 65 3d 74 74 79 48 53 4c 30 2c |console=ttyHSL0,|
00000050 31 31 35 32 30 30 2c 6e 38 20 61 6e 64 72 6f 69 |115200,n8 androi|
00000060 64 62 6f 6f 74 2e 68 61 72 64 77 61 72 65 3d 68 |dboot.hardware=h|
00000070 61 6d 6d 65 72 68 65 61 64 20 75 73 65 72 5f 64 |ammerhead user_d|
00000080 65 62 75 67 3d 33 31 20 6d 61 78 63 70 75 73 3d |ebug=31 maxcpus=|
00000090 32 20 6d 73 6d 5f 77 61 74 63 68 64 6f 67 5f 76 |2 msm_watchdog_v|
000000a0 32 2e 65 6e 61 62 6c 65 3d 31 00 00 00 00 00 00 |2.enable=1......|
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000000c0

由 #define BOOT_MAGIC “ANDROID!” ,就是它了。

3)分离 boot.img-kernel 与 boot.img-ramdisk.gz

将boot.img下载到本地,使用split_bootimg.pl这个perl脚本拆分。

split_bootimg.pl 地址:https://gist.github.com/MAGE001/07591653c9f9378d8ffb36b10814bc9f

zzhiyuan@ubuntu:~/zImage$ ./split_bootimg.pl boot.img
Page size: 2048 (0x00000800)
Kernel size: 8405280 (0x00804120)
Ramdisk size: 498992 (0x00079d30)
Second size: 0 (0x00000000)
Board name:
Command line: console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead
user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1
Writing boot.img-kernel ... complete.
Writing boot.img-ramdisk.gz ... complete.
zzhiyuan@ubuntu:~/zImage$

完成后,Android 内核就包含在 boot.img-kernel 中,但现在还不能用IDA分析,因为这是个gzip的自解压文件(注意不是标准gzip文件,还不能使用gunzip解压),需先将里面的gzip文件提取出来。

还有一点,手机厂商可能使用自已的压缩算法,这里不一定都是gzip,需要根据特征码或者文档,选择合适算法解压。如果下面介绍的解压方法中,没有找到gzip头(00088b1f),多半是这个原因。

4)解压 zImage

首先找到其中的标准gzip偏移位置:

zzhiyuan@ubuntu:~$ arm-linux-androideabi-objdump -EL -b binary -D -m armv5t boot.img-kernel |grep 00088b1f
48b4: 00088b1f andeq r8, r8, pc, lsl fp

将其dump出来,注意skip=18612是上面0x48b4的十进制:

zzhiyuan@ubuntu:~$ dd if=boot.img-kernel of=zImage.gz bs=1 skip=18612
8386668+0 records in
8386668+0 records out
8386668 bytes (8.4 MB) copied, 9.1257 s, 919 kB/s
zzhiyuan@ubuntu:~$

将其解压:

zzhiyuan@ubuntu:~/zImage$ gunzip zImage.gz 

gzip: zImage.gz: decompression OK, trailing garbage ignored
zzhiyuan@ubuntu:~/zImage$ ls
zImage

用IDA打开,看到已经可以分析。但由于缺少符号表,还是较难阅读。

另外,加载基址选择0xC0008000,就可以与 /proc/kallsyms 中看到的符号地址对应了。

5) IDA导入内核符号表(/proc/kallsyms )

下面的链接,讲了内核没用ELF标准符号表的原因:缩减体积。因此需要我们自己在IDA中导入。少仲文章介绍了如何搜索内核,定位符号位置。我的Nexus 5已经root就不费事了。直接 # echo 0 /proc/sys/kernel/kptr_restrict :-p http://stackoverflow.com/questions/14800515/unknown-arm-linux-kernel-image-format/14811668#14811668

首先通过 # cat /proc/kallsyms >> kernel_synbols.txt 导出内核符号表,其格式如下:

...
c0103168 t vfp_single_fmsc
c0103194 t vfp_single_fmac
c01031c0 t vfp_single_fadd
c0103304 t vfp_single_fsub

编写Python脚本(import_symbols.py):

import idaapi
import idautils
import idc def do_rename(l):
splitted = l.split()
straddr = splitted[0]
strname = splitted[2].replace("\r", "").replace("\n", "") eaaddr = int(straddr, 16)
idc.MakeCode(eaaddr)
idc.MakeFunction(eaaddr)
idc.MakeNameEx(int(straddr, 16), strname, idc.SN_NOWARN) if __name__ == "__main__":
Message("Hello IDC")
f = open( "D:\\TOP1_201601\\android\\exploits\\kernel_symbols.txt", "r")
for l in f:
do_rename(l)
f.close()

依次通过菜单栏的 File->Script file… 导入运行即可,运行后效果如下:

Have Fun!

从android设备中提取内核的更多相关文章

  1. 从Android设备中提取内核和逆向分析

    本文博客链接:http://blog.csdn.net/qq1084283172/article/details/57074695 一.手机设备环境 Model number: Nexus 5 OS ...

  2. bat如何创建多级文件夹(在android设备中)

    在android设备中要创建多个或者多级文件夹时,手动去创建费时费力(有点傻),一个bat文件就能很好的实现这个功能. 1.首先创建同级多个文件夹且在该文件夹下生成一个文件 @echo off ech ...

  3. XamarinSQLite教程在Xamarin.Android项目中提取数据库文件

    XamarinSQLite教程在Xamarin.Android项目中提取数据库文件 由于不能直接打开该文件,开发者需要先将数据库文件从Android系统中提取出来.操作步骤如下. (5)选择MyDoc ...

  4. 通过ADB命令行卸载或删除你的Android设备中的应用(转载)

    转自:http://mytiankong.com/?p=11755 如果你对你的Android设备在与命令行的交互间有一定的兴趣,那你可能想学习一些使用ADB卸载设备中已安装应用的技巧.为了使这种方法 ...

  5. 在桌面chrome中调试android设备中的web页面

    准备工作 1, 桌面版chrome 2, Android设备(安装有chrome浏览器) 3, Android-sdk Android-sdk安装及设置 SKD安装 从http://developer ...

  6. Android设备中实现Orientation Sensor(图)兼谈陀螺仪

    设备中的三自由度Orientation Sensor就是一个可以识别设备相对于地面,绕x.y.z轴转动角度的感应器(自己的理解,不够严谨).智能手机,平板电脑有了它,可以实现很多好玩的应用,比如说指南 ...

  7. 浅析Android设备中grep命令处理流程

    2017-04-18   概述     在TV开发板中,可以在串口中直接使用grep命令.这是因为在/system/bin/下有一个'grep'链接.这个链接指向'/system/bin/toolbo ...

  8. 通过adb命令在Android设备中执行Java命令, 并调用so文件。

    一.难点一:无法复制so文件到/system/lib或者/vendor/lib下,提示只读 解决方法: 2.使用android device monitor放库进入到 /system/lib出现只读权 ...

  9. android设备中USB转串口demo 下载

    http://files.cnblogs.com/guobaPlayer/testUSB2Serial.apk USB转串口demo程序, 无需驱动,只要手机USB是OTG类型,插上我们的模块即可使用 ...

随机推荐

  1. python操作文件(增、删、改、查)

    内容 global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defaults log global mode ...

  2. PyCharm调试运行Scrapy教程

    一.使用scrapy创建一个项目 这里使用scrapy官方第一个示例 scrapy startproject tutorial 使用PyCharm打开项目,在tutorial/tutorial/spi ...

  3. 基于spring的PropertySource类实现配置的动态替换

    public class ConfigPropertySource extends PropertySource<Properties> implements PriorityOrdere ...

  4. QAbstractItemView区分单双击

    系统不可能知道你这一次单击鼠标是为了双击指令,所以在你第一次按下鼠标时,系统会发出一个WM_XBUTTONDOWN(也就是clicked), 当你第二次单击鼠标时,系统先发送WM_XBUTTONDOW ...

  5. 加密解密 AES RSA MD5 SHA

    加密解密: 对称加密:加密和解密相同秘钥.常见算法:AES, XTEA, 3DES. 非对称加密: 公钥加密 私钥加密. 加密和解密秘钥不同.常见算法:RSA OpenSSL> genrsa - ...

  6. xubuntu无法进图形界面问题

    http://www.ubuntugeek.com/fix-for-cant-login-after-upgrading-from-ubuntu-13-04-to-ubuntu-13-10.html ...

  7. java输入一个字符串,输出该字符串的所有的排序

    public class Sort { public static void arrangeSequence(char[] strArr,int i){ char temp; ArrayList< ...

  8. bzoj2301

    题解: 莫比乌斯反演 再加上一个分块 然后和上一题差不多了 代码: #include<cstdio> #include<cmath> #include<algorithm ...

  9. VSTO:使用C#开发Excel、Word【2】

    <Visual Studio Tools for Office: Using C# with Excel, Word, Outlook, and InfoPath >——By Eric C ...

  10. html随笔CSS(*^__^*)

    控制文本显示字数,超过规定的文本长度  x显示... white-space:nowrap;        //规定不能换行 overflow:hidden; text-overflow:ellips ...