【老骥伏枥-狗年大礼包】嵌入式linux逆向工程,手把手教你作黑Q-第一讲

2019-07-12 15:00发布

原文网址:http://www.nasyun.com/forum.php?mod=viewthread&tid=39736&fromuid=106494
(出处: NAS云论坛) 前言 最近坛友经常问论坛中的黑群晖版发布非常活跃。为什么为什么黑威联通像一潭死水。坛友希望我能再次为黑威联通做一个启动盘。为了答谢坛友们的厚爱,我再次出手制作了一个教学演示用的创建黑威联通启动工具盘。需要说明的是,我不是一个黑客。资源来自于威联通官网公布的系统包和发布的固件。参考文献中注明所有引用的出处。本文深入浅出地介绍了嵌入式linux逆向工程的概念,原理及实现的技术细节。并为教学实践提供了演示用的创建黑威联通启动工具母盘。此启动盘的理念和启动引导的基础架构设计均绝对是老骥伏枥本人独创,并合法利用开源项目 (Tiny Core Linux Project) [1] 开发的。 也是老骥伏枥通过 NASYUN 论坛在全球独家首发。 请坛友们遵守 GNU General Public License, 未经授权禁止用于商业用途。 该演示用工具母盘为的是进行教学, 研究和技术交流。 禁止用于任何商业目的。   第一讲
嵌入式linux逆向工程与常用工具简介

我们为什么要学习嵌入式linux逆向工程呢?答案很明显。利用这个手段,了解和破解提取Linux的嵌入式系统固件的内容。为什么呢?我们可以: 破解固件或将固件升级(增加功能); 审计的安全级别固件;乐趣! 和许多其他的事情!

嵌入式设备固件代码的逆向解析常常被用于破解固件或将固件升级维护及关键电子设备的功能解读和安全防护, 因此学习,研究固件代码逆向解析技术是软件工程中的一个重要领域。 在这个领域中,研究针对Linux固件的逆向解析识别框架;研究固件的一般结构和三大模块的运行机制、实现机制、存储介质相关性及其相互之间的关系等等,会涉及到使用局部特征和分布特征相结合的方法去搜索可疑模块并对模块区间进行排除性剥离,也可能会存在逆向分析过程中固件获取不完整性和固件读取出错的问题。还有就是经验的积累,工具的利用等等。对于菜鸟和小白们,我推荐一本初学者的书"逆向工程入门指南"[2] 给你们读一读。

利用工具进行逆向解析可以提高效率。接下来我介绍如下几款工具给大家,这些只是我自己喜欢用的工具,不一定是最好的工具,也不一定适合你。

一,Binwalk - 开源固件分析工具[3]
binwalk是一个固件文件的分析工具,旨在协助研究人员对固件文件进行分析,提取及逆向工程。简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,还重要一点的是可以轻松地扩展。在linux系统上的安装方法也是十分简单的,而在windows系统上的安装方法我就不知道了。新手百度下“binwalk工具运行支持的平台”[4] 。

二,Interactive Disassembler (IDA) -交互式反汇编工具[5]
IDA 的官方网站是 https://www.hex-rays.com/ 。在网页上可以看到 IDA 的插件、SDK 等内容。IDA 会在官网提供 Demo 版的下载。然而, Demo 版没有 IDA 最强大的反汇编功能,正版的证书费用比较贵。(专业人士还是建议买证书)。网上也有提供破解IDA Pro版的,可以用来学习。新手百度一下“破解IDA Pro版”。关于IDA的特 {MOD},我就不在这里赘述了。推荐大家一个文章:“今天开始学逆向:反汇编的利器IDA和Hopper的基本使用”[6] 。有兴趣的坛友可以读一读。

三,Snowman C/C++反编译器[7]
支持ARM,x86和x86-64体系结构。读取ELF,Mach-O和PE文件格式。重构函数,它们的名称和参数,局部和全局变量,表达式,整数,指针和结构类型,所有类型的控制流结构,包括开关。有一个很好的图形用户界面,汇编程序代码和重建程序之间的一键导航。有一个用于批处理的命令行界面。

四,SystemRescueCD 开源x86平台的Linix操作系统[7]
SystemRescueCd是x86计算机平台的操作系统,但SystemRescueCD的主要目的是在系统崩溃后修复无法启动或以其他方式损坏的计算机系统。 SystemRescueCd不打算用作永久性操作系统。 它从Live CD,USB闪存驱动器或任何类型的硬盘驱动器运行。 它由FrançoisDupoux领导的团队设计,基于Gentoo Linux发行版。我很喜欢使用这个Linix系统。 一张CD盘,不用安装直接启动,就能立即使用。并且包含各种各样的系统救援工具。
 
第二讲
手把手教破解威联通固件

作为教学实践的示范,下面我将一步一步地讲述从下载官方发布的固件开始,如何完成固件代码逆向解析的。遇到需要补充嵌入式linux系统结构和相关知识时,也会详细说明。力求通过本次的教学实践示范,让大家详细了解威联通系统。但我们的目的是教学,研究,不是黑客。禁止利用本教学示范,从事任何商业目的。

首先我们去威联通的官网,选择一个它发布的固件。我会选择比较新的4.3.3版固件。但我不会选择最新版。我破解固件,会遵守江湖上的潜规则,不会破解最新版,至少要低一个小版本号。

 威联通官网固件.txt (5.77 KB, 下载次数: 652) 

威联通官网发布的固件包是zip格式的压缩包。解压后会得到一个img文件。这个文件是什么格式,我不知道。所以就要使用Binwalk固件分析工具来查一查它。看看有什么线索。扫描的结果如下:
" lazyloaded="true" _load="1" style="word-wrap: break-word; margin: 0px; padding: 0px; text-decoration: none; font-style: normal; border: 0px; cursor: pointer;">

扫描的结果非常令人沮丧。根据经验,这个扫描结果不能提供什么线索。

思索与分析:
固件可能是加密的。因为这是威联通官网发布的固件,既然它是为Update威联通而发布的,那么威联通的系统在Update时就一定会有解密的方法。因此需要通过研究它的固件更新机制,获取固件包的内容。这是威联通固件的第一个坑。

为了研究威联通系统的固件更新机制,只能想办法找一台威联通,正好我的一个朋友有一台威联通TS288设备。使用SSH登陆后,在/etc/init.d/update.sh的文件中发现了这样的代码:
 
  1. /sbin/PC1 d QNAPNASVERSION4 "$path_name" "${_tgz}";
  2. /bin/tar tzf "${_tgz}" 2>/dev/null
复制代码

根据经验,这段代码给人的直观印象是,它要将"$path_name"所指的文件解密为一个"${_tgz}"文件。为了验证我的想法,我将官网发布的固件拷贝到该设备,运行了/sbin/PC1试一试。结果出乎意料地好。我拿到了一个tgz文件。将这个tgz文件下载,再用Binwalk固件分析工具来查一查它。

扫描的结果如下:
" lazyloaded="true" _load="1" style="word-wrap: break-word; margin: 0px; padding: 0px; text-decoration: none; font-style: normal; border: 0px; cursor: pointer;">

这个结果非常振奋人心。起始地址0开始为gzip compressed data。也就是说这是一个真正的tgz文件。接下来,我需要把/sbin/PC1下载到我的机器中,进行分析。因为以后制作启动工具母盘的时候,这是一个必须的文件。

/sbin/pc1是一个ELF格式的可执行文件。一般情况下,我会用IDA Pro工具先对它做个静态分析,如果需要更近一步的话,我会再用gdb工具做动态分析。其实PC1很简单。静态分析足以。情况如下截图:
" lazyloaded="true" _load="1" style="word-wrap: break-word; margin: 0px; padding: 0px; text-decoration: none; font-style: normal; border: 0px; cursor: pointer;"> 
" lazyloaded="true" _load="1" style="word-wrap: break-word; margin: 0px; padding: 0px; text-decoration: none; font-style: normal; border: 0px; cursor: pointer;"> 
" lazyloaded="true" _load="1" style="word-wrap: break-word; margin: 0px; padding: 0px; text-decoration: none; font-style: normal; border: 0px; cursor: pointer;"> 

并无悬念它是威联通用来加密,解密官网发布固件的。密钥是“QNAPNASVERSION4”并且固定不变的。使用Snowman对他做C/C++反编译,就可以生产一个pc1.c文件。留着我以后制作启动工具母盘时重新编译使用。这第一个坑总算是迈过去了。

由于NASYUN的篇幅限制,请继续看楼下,【手把手教你破解威联通固件】, 精彩继续!