应用GHIDRA逆向Tytera MD380的固件 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

应用GHIDRA逆向Tytera MD380的固件

申博_新闻事件 申博 128次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

配景学问引见

2019年1月,美国国家平安局(NSA)宣告,它将免费向民众开放其逆向工程对象GHIDRA,源码已于往年3月上岸代码托管平台GitHub 。NSA指出,GHIDRA框架的素质,是一款适用于 Windows、Mac 和 Linux平台的反汇编顺序。它能够或许将可实行文件分解为汇编代码,以举行剖析。关于愿望深切相识歹意软件,以检察其事情道理的平安研讨人员来讲,反汇编对象是相称有效的。现实上,NSA早已向别的政府机构分享过该对象。2017年的时刻,维基解密在Vault 7中初次曝光了GHIDRA,音讯来自于中央情报局(CIA)的内部文件。

用过Tytera MD380对讲机的同伙很多,其较高的性价比让人人轻松无压力的从纯模仿电台跨步到了DMR数字时期,从而感受到DMR手艺的魅力。

不外几年前,我们就晋级了这个对讲机的固件了,并对其举行了逆向工程。为此我们特地构建了md380tools项目,以便经由历程其他功用比方全局用户目次,殽杂形式和其他USB功用晋级固件的功用。

所谓的殽杂形式(Promiscuous Mode)是指一台机械能够或许吸收一切经由它的数据流,而岂论其目标地点是不是是他。它是相对一般形式(又称“非殽杂形式”)而言的。这被收集管理员运用来诊断收集题目,然则也被无认证的想偷听收集通信(其能够包孕暗码和别的敏感的信息)的人应用。

以下,我会向你细致引见怎样将MD380对讲机固件加载到GHIDRA,然后从md380tools逆向工程项目中导入符号。

设置装备摆设引见

起首,你应当具有MD380Tools源代码,将其举行编译以天生中心文件,比方符号和解密的固件映像。若是你还没有嵌入式ARM开发对象链,请参阅以下内容。

% git clone https://github.com/travisgoodspeed/md380tools
% cd md380tools
% make release

加载固件

GHIDRA好像在设计时斟酌了固件,而且它很愿意支撑加载原始二进制文件。

让我们从File/New项目最先,建立一个新的非同享项目。

翻开项目后,加载md380tools / firmware / unwrapped / D013.020.img或任何其他未封装的固件映像,这些剧本是由Makefile剧本经由历程互联网上加密不良的固件中更新天生的。

我们必须将言语设置为little-endian ARM Cortex (ARM:LE:32:Cortex),并运用选项窗口设置正确的加载地点。这些映像包罗从48k指导加载顺序最先的闪存,因而我们须要加载地点0x0800C000。

应用GHIDRA逆向Tytera MD380的固件

加载映像后,我们如今将Flash加载到正确的地点,然则我们没有RAM,也没有IO和函数符号。让我们起首运用自动剖析器找到函数进口点,然后导入它们的专有称号。

开端剖析

当你在加载后初次双击D013.020.img映像时,GHIDRA将提醒你运转具有恣意数目默许选项的自动剖析器。挑选默许选项后,再守候一分钟,你将发明数百个函数被正确的标识出来。

不幸的是,并非一切的内容都能立即被辨认出来。比方,位于开首(0x0800C000)的表是中断向量表,但它不位于默许地点。 GHIDRA异常智慧,能够或许辨认个中的很多条目。但有一些破例,好比应用顺序本身的代码从未挪用的初始客栈地点(0x0800C000)和重置向量(0x0800C004)。为了相识自动剖析器是怎样失利的,有须要研讨个中的一些题目,然则在本教程中我不会存眷它们。

与IDA Pro(一个静态反编译软件)和Binary Ninja(一个逆向平台)分歧,GHIDRA的言语设置观点许可它提早晓得这个二进制文件完全是Thumb2,没有典范的ARM指令,也不须要设置假造寄存器。

在继承从MD380Tools项目中导入其他构件之前,让我们先看一下一些简朴的函数,并运用它们来查找其他函数。

让我们从SPI Flash驱动顺序的最低级别最先。SPI Flash是一个外部闪存芯片,包罗对讲机的代码插头、界说频次和设置装备摆设设置。在逆向工程中,视察它们怎样从SPI Flash芯片中读取设置是异常有资助的。

起首导航到0x080314bd处的md380_spi_sendrecv函数。经由历程在反汇编视图中按G来实行此操纵,然后向GHIDRA供应地点,它将四舍五入到0x080314bc。在内部,ARM具有一切Thumb函数的奇数地点,但GHIDRA不遵照此商定。以后,挑选函数的称号并按F键编纂函数界说,将称号变动成md380_spi_sendrecv。我们能够把这个函数设想成getchar()和putchar(char)封装成的一个函数。它会从SPI破绽中发送一个字节,同时返回响应的字节。

接下来,导航到0x080314bd并检察其反编译视图。你能够看到,这会发送字节0x03,然后是第二个参数的三个字节。以最主要的最先,然后再是第一个参数指向的一切字节,用于第三个参数的计数。

Windows破绽应用技能:滥用用户形式调试器

前言 最近,我一直在研究如何为NtObjectManager添加本地用户模式调试器支持。每当我添加一个新功能时,我都必须进行一些研究和逆向工程工作,以更好的理解其具体的工作方式。在这种情况下,我希望知道调试现有的正在运行的进程需要什么级

void FUN_080314bc(undefined *puParm1,uint uParm2,short sParm3)

{
  undefined uVar1;  
  FUN_0803152a();  md380_spi_sendrecv(3);  md380_spi_sendrecv(uParm2 >> 0x10 & 0xff);  md380_spi_sendrecv(uParm2 >> 8 & 0xff);  md380_spi_sendrecv(uParm2 & 0xff);  while( true ) {    if (sParm3 == 0) break;
    uVar1 = md380_spi_sendrecv(0xa5);
    *puParm1 = uVar1;
    puParm1 = puParm1 + 1;    sParm3 = sParm3 + -1;
  }  FUN_08031546();  return;
}

从SPI Flash的数据表中,我们晓得0x03是从芯片读取数据字节的敕令。这个函数的实在称号是md380_spiflash_read,跟踪它读取的地点许可我们将固件中的函数与其在codeplug中的寄义婚配起来。由于我们晓得必须在读取之前挑选芯片,然后在读取以后作废挑选,以是我们能够预测FUN_0803152a现实上是md380_spiflash_enable而FUN_8031546现实上是md380_spiflash_disable,以至不须要读取它们的代码。

应用GHIDRA逆向Tytera MD380的固件

运用反编译视图中的L键来界说参数、函数和变量称号,我们能够在去除反编译后获得很多有效的器械,举行很多清算反编译。你能够运用;解释符号。

void md380_spiflash_read(undefined *buffer,uint adr,short length)

{
  undefined currbyte;  
  md380_spiflash_enable();                    /* 0x03 = READ DATA BYTES command */
  md380_spi_sendrecv(3);  md380_spi_sendrecv(adr >> 0x10 & 0xff);  md380_spi_sendrecv(adr >> 8 & 0xff);  md380_spi_sendrecv(adr & 0xff);  while( true ) {    if (length == 0) break;
    currbyte = md380_spi_sendrecv(0xa5);
    *buffer = currbyte;
    buffer = buffer + 1;
    length = length + -1;
  }  md380_spiflash_disable();  return;
}

经由历程这些要领,我们就可以找到相干的功用。在反汇编视图中右键单击函数称号,然后挑选“显现援用”以显现函数的每一个挪用者。在md380_spiflash_enable()上运用Ctrl + Shift + F实行此操纵,我们能够获得六个与SPI Flash交互的函数,比方md380_spiflash_write(),md380_spiflash_sektor_erase4k()和md380_spiflash_block_erase64k()。对md380_spiflash_read()实行此操纵将为我们供应从SPI Flash中读取的每一个函数,而且从这些地点中我们能够晓得它们正在读取甚么。

比方,斟酌这个从0x2040读取20个字节的未知函数。

undefined4 FUN_080226c0(void)

{
  undefined4 unaff_r7;  
  md380_spiflash_read(DAT_08023398,0x2040,0x14);  return unaff_r7;
}

在md380tools/chirp/md380.py的不完整CHIRP驱动顺序中,我们看到0x2000是一个设置装备摆设构造,包罗两个用于启动文本的二十字节字符串。这个神奇函数是Get_Welcome_Line1_from_spi_flash,我们能够钩住或修补它来变动在启动时显现的文本!

#seekto 0x2000;
struct {
    u8 unknownff;
    bbcd prog_yr[2];
    bbcd prog_mon;
    bbcd prog_day;
    bbcd prog_hour;
    bbcd prog_min;
    bbcd prog_sec;
    u8 unknownver[4];       //Probably version numbers.
    u8 unknownff2[52];      //Maybe unused?  All FF.
    char line1[20];         //Top line of text at startup.
    char line2[20];         //Bottom line of text at startup.
...

加载RAM的中心转储

如今,我们能够从SPI Flash映像中跟踪这些设置,这听起来很酷。然则若是我们经由历程检察RAM中的0x08023398来检察个中加载了哪些字节,结果就更好了。为此,我们须要在0x20000000处建立一个128k的地区。STM32F405在0x10000000处也有64k,但链接器很少运用静态缓冲区。

从“文件”菜单中挑选“增加到顺序”以增加第二个映像。挑选md380tools/cores/d13020-core.img,这是一个经由历程USB从D13.020的启动副本天生的及时RAM转储。在选项窗口中,我们必须将加载地点设置为0x20000000。

应用GHIDRA逆向Tytera MD380的固件

如今我们能够导航到存储字符串的0x2001E3FC。将第一个范例界说为wchar16,然后按[建立一个包罗10个元素的数组。在0x2001e410中对第二行实行雷同的操纵,你能够在SRAM中看到我的对讲机设置装备摆设的两条启动线!

   2001e3fa 00              ??         00h
        2001e3fb 00              ??         00h
        2001e3fc 4b 00 4b        wchar16[   u"KK4VCZ    "
                 00 34 00 
                 56 00 43 
        2001e410 33 00 31        wchar16[   u"3147092   "
                 00 34 00 
                 37 00 30

修正笔墨池

末了一个小麻烦是,反编译器对ARM笔墨池的明白不是很到位。ARM并没有32位的立即信息,相反,它经由历程在函数之间存在数据池来捏造它们,这些数据池是相对顺序计数器援用的。

此时GHIDRA的逆向历程就会受阻,由于从理论上讲,这些笔墨池能够会被新的32位值掩盖。由于这类殽杂,反编译器外面上会通知你通报的值是DAT_080233b0,而现实上0x2001E410是0x080233b0处的唯一值。

void Get_Welcome_Line2_from_spi_flash(void){
  md380_spiflash_read(DAT_080233b0,0x2054,0x14);
  return;
}
DAT_080233b0             XREF[1]:     Get_Welcome_Line2_from_spi_flash
080233b0 10 e4 01 20     undefined4 2001E410h

现实上,这类闪存修正起来相称庞杂,而且代码不克不及直接被写入。因而,我们须要通知反编译器,Flash页面不克不及在窗口/内存映照中写入。简朴地作废复选框并生存新的内存映照将改正反编译历程,向我们显现正在通报的字符串是“3147092”。固然,我们能够给它一个更清楚的称号,并搜检交织援用,以便相识哪些其他函数运用第二个迎接行。

应用GHIDRA逆向Tytera MD380的固件

void Get_Welcome_Line2_from_spi_flash(void){
  md380_spiflash_read((char *)u_3147092_2001e410,0x2054,0x14);
  return;
}

从GNU LD加载符号

既然我们已学会了寻觅本身的函数,如今多是导入其他人已找到的函数的好时机。

在GHIDRA包罗的很多优异示例剧本中,有一个是ImportSymbolsScript.py,它接纳符号称号和地点的平面文本文件在翻开的项目中建立标签。

#Imports a file with lines in the form "symbolName 0xADDRESS"
#@category Data
#@author 
 
f = askFile("Give me a file to open", "Go baby go!")

for line in file(f.absolutePath):  # note, cannot use open(), since that is in GhidraScript
    pieces = line.split()
    address = toAddr(long(pieces[1], 16))
    print "creating symbol", pieces[0], "at address", address
    createLabel(address, pieces[0], False)

在md380tools项目中,我们运用Radare2符号来符号我们对映像和GNU LD剧本的意见,以符号我们现实链接的那些局部。运用symbols2ghidra.py <symbols_d03_020> ghidrasyms.txt转换GNU LD剧本异常简朴。

应用GHIDRA逆向Tytera MD380的固件

应用GHIDRA逆向Tytera MD380的固件

经由历程上文,我们能够很轻易将MD380固件和符号加载到GHIDRA中,而且反编译器在二进制文件上做了很多庞杂的事情。

你还应当注重正确地符号内存页,由于它们是反编译器天生清洁、紧凑代码所必须的。处置惩罚同享项目标用户,必须确保在变动内存映照或加载新地区之前只签出一个文件。

译者注:常常有效户问该怎样修正文件。实在除点击菜单栏上的“修正”来修正文件,菜单“版本”里的“签出”也能用来修正文件。

当你要修正文件时,先选中文件,然后点“签出”,文件自动签出并翻开后,你修正文件,并生存修正内容。再点“签入”,文件就会生存到多可体系里。

简朴说来,该流程就是:签出 -> 修正并生存 -> 签入。

收集赤军部队建设指南

0x00、Red Team建设目标 在平时听新闻联播,军事解决当中,我们都会听到红蓝军对抗,在信息安全行业与军方的一些相似性,网络世界Red Team就是攻击者的一方。安全能力的提升,在安全威胁没有挖掘出来之前,只能通过攻防对抗的形式体现出


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明应用GHIDRA逆向Tytera MD380的固件
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址