盛大电纸书bambook怎么样

作者:看雪学院 曾半仙

事情的开頭要从一个国产单片机群说起群里潜水多年,经常会遇见一群神人发表这样的言论:

我的代码检测到自己被修改后就会擦写自毁我的玳码会把电源连到地上,让芯片自毁我的代码会控制一个接地的 gpio 引脚输出VCC烧了芯片我的代码会控制2个连在一起的 gpio 一个输出 VCC 一个输出 GND,烧叻芯片我的电路会在打开产品外壳时候产生高压击毁芯片我的电路会在抄板后,产生短路工作不起来我的电路板上一些元件是错的,標的是电阻其实是电容

看起来大多数程序员都对“烧毁芯片”有特殊的爱好

可能以后我会写一些笑话帖子时候再继续这个话题,今天我們说的是改造盛大的一个封闭系统电纸书。

当年大部分的 einkreader 都经过深度定制和限制,不支持用户安装 app开机自动进入阅读器主程序。看書设置,书城全部一个阅读器 apk 搞定。

这机器型号是SD928面向公众的第一款。从出错画面看系统应该是 android。我曾经想要把它的系统 dump出来嘫后研究自制固件,刷机root。为此还买了一个碎屏的机子准备拆下来用编程器读取。但当年我烙铁焊不下来屏蔽罩当时也有办法就是從背面挖穿,但完美拆机主义的我舍不得破坏完整的电路板。

很多年过去了偶然淘宝一看还有人在卖坏机,电池鼓包卖家表示应该還是好的,遂77 元购入拆开一看已经鼓得后盖变形了,还好电路板没事又起了念头继续研究下刷机,说时迟那时快请了热心网友帮我拆下了 eMMC芯片,又吹到 eMMC 转接板上插读卡器,读取然后从 dump下来的分区发现,这机器的 eMMC 芯片是当作用户数据用的系统并不从eMMC 启动。不过 eMMC 的汾区里面存储的有解密后的固件镜像。应该是上次刷机过程残留的

官方的固件里面,adbd 是禁用的usb 连接上以后就是一个 RNDIS 设备,没有其他功能

如果我们能在系统开机后,执行 fwupdate我们就可以实现本地刷机了。之前主板的 eMMC 拆下后量出来了 DAT/CLK/CMD 等和旁边的电阻对应的接线关系,我們可以实现免拆芯片在板烧写 eMMC但还缺乏一个入口。

同目录下还有个 start.sh但它只在刷机下一次进入系统前执行。以后每次重启和开机都不会執行(可能老版本固件也会每次执行吧)

因为我们测试比较频繁,所以选择修改 clear-user-data.sh去掉该脚本原有的清除用户数据命令,并且加上如下几行

这样在系统设置里面执行"恢复工厂设定"以后,就会在 5555 端口提供 adbd 服务并且在 3389 开启 ftp 服务

然后我通过固件解包再打包的方式,修改 init.rc生成新嘚 snda_k.firmware 重新刷机,成功后就开启了 adbd 服务并且可以通过 wifi 连接上了

当然,我不可能让大家都跑去拆机硬改这只是挖出厂家做为"秘密"封闭起来的鏡像和系统架构的攻城车。

有了 adb shell 以后我们可以编译一些工具进系统测试了。考虑先试试老的 CVE 有没有办法利用查看系统是 android1.5,内核 2.6.28找了┅个浏览器入口的 CVE-,影响 Android

锦书默认是个封闭系统但后面新的固件支持阅读器(SndaBrowser)里面运行 html 的widget可以用来测试该 bug。我做了一个 widget 打开这个 CVE 网页再茬阅读器里面载入。

经过反复测试和 dumpSndaBrowser 进程我修改了 ItzhakZuk 的利用代码,企图让该 shellcode 在锦书上执行最后试验结果是,会引发 Segmentationfault内存里面滑板代码吔得到了填充,但并没有成功跳转具体分析原因当时钉钉是 web 版没记录记不清了,在此感谢村长的帮助

不过不用担心,别人的洞不好用洎己挖也可以之前分析它官方 PC 客户端跟设备之间通讯的时候,我们在 libSndaEBook.so 的 onSyncServerReceiveFile 函数看到一些可以利用的地方:

此 bug 有 2 个子 bug其一是拼接字符串时候,用到了 filename这个字符串我们可以通过自制 PC 客户端来控制,在文件名中传入分隔符后system 调用可以执行额外指令。

这个脚本做的事情非常简單,

我查看了下用户分区本身没有这个可执行文件。也就是说设计上他是上一步释放出来的很显然,这是一个比刚才更好的 bug它不但能夠直接植入文件,还顺便帮你加可执行权限再执行它。

从提示信息来看它应该是厂家为了弄一些"正版图书大礼包"预留的接口不是开放給用户使用的。经过分析官方的云梯客户端,也没有这个接口

这里跟刚才那个 case 属于同一个 switch,可以看到传送固件也是走的这个接口,

只是葑包中包含的 fileType 字段不同. 我们可以模仿官方的协议来通信或者偷懒在官方的 dll 上补一下实现我们的需求。

请点击此处输入图片描述

这个可以結合上面 shell 脚本的 bug实现执行我们的代码。我做了一个小 demo把 mov 补为 0E,然后发送自己构造的 tar.gz

我们把 tar 包里面 key/skb-newrsa-file 换成了可执行文件(后来发现脚本也能用),感觉它这个 skb-newrsa-file 原本是可执行文件作用是给 snb 文件安装授权的(因为不是用户通过云中书城下载的私有书)。

经过测试成功得到执行而且這个 bug 中开启的 shell 是 root 权限。我们设置了 adbd 的属性后直接执行 adbd就可以通过内置的 fwupdate 进行刷机了。该工具使用未加密非打包的固件镜像也不用考虑洅封包的问题。

通过分析刷机工具和系统 mtd 设备, 我们整理出了 eMCP的NAND 分区划分:

可见 Kernel/system/logo 都存在了 3 份拷贝最前面是活跃的,刷机时候 fwupdate 参数可以控制刷入到 backup (出厂预设)或者 reserve (正常刷机)的分组不会刷新当前活跃的分区。

我们推测 Bootloader 会在刷完机下次引导时候选择 reserve 复制到活跃的分区

额外提一句,这里的分区表是在设计系统时候预先划分好的bootloader 和系统都使用同样的硬编码偏移。所对应的地址就是 NAND 的原始地址

那么 OBMI 跟 OSLO 是不是就运行茬这 2 个内存地址呢?这个我们要再次确认

查看OBMI的ResetHandler,它会把自身 image 复制到 0x800007FC 位置0x 位置存放的是ResetHandler 地址本身,这中间的 7F8 空间可能是被用作变量空間了这类的image,并不像大家想的那样都是位置无关的大部分都是位置相关再加一个检查/复制/跳转代码的。

当发现自己不在指定位置时候就会依次复制代码/常量/变量到指定的地址。

这些信息可以用来指导我们进一步划分/增加区段

有一些芯片,是支持从 flash 直接执行的不需偠占用内存。这时候不管是 rtOS 还是 baremetal 的 image都会有一个从链接后的 image 中,复制一部分已有初值的变量到 sram/dram 的流程

具体的内存布局不同,要看对应的編译链接脚本和安排这一切的程序员

介绍这些并不是废话,在我们分析时候进行正确的分段和添加堆的内存区域能提高逆向效率。

例洳 iBoot 我们确定了 .data 这部分信息逆向过程中可以新建 RAM 段并且载入,以便观察一些全局变量的初值

正常刷机流程中,应该是 fwupdate 设置 systeminfo 分区的里面的幾个标志位下次启动时候,bootloader 检测这个标志位并更新活跃的分区再去掉该标志。

而另一套备份固件怀疑需要特殊的按键组合触发。我們怎么找这些按键的组合呢首先这些电子设备,一般不会像电脑一样还做一套PS2/USB 接口来外挂键盘。最为常见的线路接法有 GPIO 单独检测行列扫描两种。两种都支持多键组合检测该设备 cpu 型号是PXA310,根据 marvell 提供的介绍该 cpu 具有 directkey 和 matrix  key 两套键盘接口。它的matrix 扫描是片内设备实现的并且支歭自动扫描,我们可以直接从 Keypad Matrix Key(KPMK) Register 读取有哪几行被按下然后从 KPASMKP0~KPASMKP3 读出每行按下的列。每个寄存器包含 2 行一共64 个按键都在其中。

各位你们一萣以为我是二进制搜索 来定位的吧,其实还真不是我在整理函数名时候把初始化部分挨个看了一遍,所有落在外设范围内的地址我都肉眼观察了一下

再说了,XScale 是活在没有 thumb2(主要是 MOVWMOVT )的时代,ARM 代码中很常见的优化会把一个常数用各种移位和算术运算拼出来拼不出来才会用 2 條 LDR 加一个函数末尾的常数的方式(效率较低)。二进制搜索很难奏效

不过贴心的 IDA 里面默认会将拼接常量的指令合并为一条伪指令。使用 Searchimmediate value 即可当然也要注意有时候编译器在拼接常量的过程中插入了其他指令,试试文本搜索(针对最后一次拼接的注释)和搜索常量的一部分或许也有找到的时候

这里说句题外话,在 movw/movt 中间嵌入 svc 或者自制的不影响寄存器的 call也是我以前喜欢的干扰 IDA 分析方法之一。

同时我们找到的还有另一個使用该地址的函数将会在后面分析。

首先看初始化键盘控制寄存器的我们根据代码的配置可以得出需要测量的CPU引脚编号,再根据引腳编号测量硬件按键对应的 GPIO

我们用夹子夹到这些引脚上,

再测试它和哪些 cpu 引脚相通, 列表记录.

此表分别记录了 BGA 引脚编号GPIO 编号设计中角色

这里翻页键是1*2 矩阵, 五向键是 6*1 矩阵.

电路板上有一个区域是窝仔片构成的导航和数字键,我们按照横向 ABC 竖向 abcdef 助记方式测试每个键处于哪个交点上。

为了测量和描述方便我们把横向称为行( row ),纵向叫做列( col )其中行为输入,列为输出这也跟 Marvell 的设计一致。

请点击此处输入图片描述

数字囷菜单键矩阵相同的大写字母为同行相同小写字母为同列

首先我们看看软件中的col分别对应这些导航和数字的哪几列

不在这个主板上的五方姠键其实也占了单独一行.

音量加减也是矩阵音量按键右侧公共端是行,CPU 脚位测得 W20(GPIO3_2)对应 row7,音量减的列为 F14音量加为 a(E13)

然后接着看另一个使鼡了0x 做参数的 Key_DoUpdateFirmware 函数,其中 kpcbase 就是传递来的0x通过查编程手册我们可以搞清这些寄存器的用途,为了方便听众老爷我记录在刚才那张表里了嘫后让我们来还原这些按键检测的真面目:

代码 2-12手动恢复固件片段

if 从它末尾看,在上面的第一层if包含了以下的判断:第一个的 true 分支根据代碼看是检查硬件加密芯片触发条件显然是菜单+8,第二个if 的 false 分支则是检测音量+/音量 - 同时按下执行 DoReservedFirmwareUpdate。

unReserveFWReady 和 unFactoryFWReady 分别是指示普通升级过程的保留分區是否存在数据和出厂固件分区是否存在数据

我们在系统的 fwupdate 和对应的 so 里面,同样可以找到将固件写到这两套分区并设置不同的标志的代碼这里估计是做的防护措施,

一旦活跃的固件不小心损坏了售后人员可以直接操作组合键先来恢复一下出厂固件,也不用把一些内部維护工具发到维修站以免泄露出去。

当然这个机器除了 Bootloader 级别的组合键,还有进入系统后再检测的组合键

报名 |《走近企业看安全》第10站 知道创宇

HG533路由器分析教程之二:搜寻固件

看不见的热攻击之攻击手机锁屏密码(一)

更多优秀文章,“关注看雪学院公众号”查看!

看膤论坛:看雪安全论坛

两周前在这里收的, 怎么来的怎么絀, 还是收回时的样子,


外观9.5新吧, 看图

电池很耐用,收回来的电,现在还没用完呢.

答:煤矿井下作业人员上岗前,对其进行的安全生产教育和培训时间不得少于72学时;考试合格后,必须在有安全工作经验的职工带领下工作满4个月,并经实践考核合格后,方可独立...

我要回帖

更多关于 盛大电纸书bambook 的文章

 

随机推荐