【IOT路由器固件解密】Ghidra逆向获取key和文件格式解析实战
2023-11-23 20:40:46 Author: xz.aliyun.com(查看原文) 阅读量:13 收藏

从网站找到固件链接下载后查看,加密固件版本的说明如下:

Note:
1. The firmware version is advanced to v1.10
2. The firmware v1.10 must be upgraded from the transitional version of firmware v1.04 (transitional version).
Problems Resolved:
1. Update wpa2 security patch
2. Upgrade dnsmasq to 2.78
Enhancements
1. Support D-Link Wi-Fi APP
(QRS mobile won’t be supported from firmware version v1.10 or later version)
2. Support image with encryption
3. Support EU VLAN @ EU country code
4. Support VLAN profile @ SG country code

其中第二点表示固件v1.10必须从固件v1.04的过渡版本(过渡版本)升级,未加密固件中间版本安装说明如下:

Note:
1. The firmware v1.04 is the transitional version for upgrading to v1.10 or later version.
2. Below is the procedure for firmware upgrade: 
 Connect to the router via LAN port or WIRELESS interface.
 Log in to the D-Link management page (http://192.168.0.1 or http://dlinkrouter.local./)
 Go to the firmware upgrade page, upload the firmware v1.04 and wait for the device to reboot.
 Log in to the D-Link management page again.
 Go to the firmware upgrade page and check the button of online firmware check and download the firmware 
v1.10 or later version.
 Upload the firmware v1.10 or later version.
 Wait for the device to reboot and don’t power off the router during the firmware upgrade.
 The router is fully upgraded

可以发现,其中,根据官方说明书得知,其中固件版本FW104B02_Middle_FW_Unencrypt.bin是未加密的版本,固件FW110B02_FW_Encrypt.bin是加密的版本,如果设备选择继续更新,必须经过中间版本更新后才能后更新到后续版本,不能够跳跃升级。接下来,将两个版本使用binwalk固件系统解析工具执行结果,对比如下:

┌──(kali㉿kali)-[~/Desktop/22-11]
└─$ binwalk -Me FW104B02_Middle_FW_Unencrypt.bin 
Scan Time:     2023-11-22 01:16:26
Target File:   /home/kali/Desktop/22-11/FW104B02_Middle_FW_Unencrypt.bin
MD5 Checksum:  0033169720f7b89df8d1ea90fd629913
Signatures:    411
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             uImage header, header size: 64 bytes, header CRC: 0x50982AB1, created: 2018-03-11 13:18:48, image size: 13265102 bytes, Data Address: 0x81001000, Entry Point: 0x816118E0, data CRC: 0x3A2AC829, OS: Linux, CPU: MIPS, image type: OS Kernel Image, compression type: lzma, image name: "Linux Kernel Image"
160           0xA0            LZMA compressed data, properties: 0x5D, dictionary size: 33554432 bytes, uncompressed size: 18684352 bytes
Scan Time:     2023-11-22 01:16:30
Target File:   /home/kali/Desktop/22-11/_FW104B02_Middle_FW_Unencrypt.bin-0.extracted/A0
MD5 Checksum:  6397f148a2fde088bee8fadc0dc777f8
Signatures:    411

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
1864554       0x1C736A        PGP RSA encrypted session key - keyid: 80103C 458CEC RSA Encry
.
.
.
.
42820832      0x28D64E0       ASCII cpio archive (SVR4 with no CRC), file name: "lib/librcm.so", file name length: "0x0000000E", file size: "0x00046D60"
43111100      0x291D2BC       ASCII cpio archive (SVR4 with no CRC), file name: "lib/libpcre-0.9.28.so", file name length: "0x00000016", file size: "0x0002B80C"
43289420      0x2948B4C       ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"           
┌──(kali㉿kali)-[~/Desktop/22-11]
└─$

使用命令:binwalk -Me FW110B02_FW_Encrypt.bin,执行结果发现无法解析固件的文件系统,可以发现,文件系统已经被加密,无法正常解析。

对于不知道是否加密的也可以通过binwalk -E 固件文件.bin 的命令查看,如果熵值接近于1,且几乎无变化,那么很可能是将文件字符加密混淆产生的结果,还包含另一种可能是经过了文件压缩,使得产生的熵值图象与加密熵值图象接近,此时无法识别是否加密固件,那么此时可以通过binwalk -Me 固件文件.bin的命令强制解析固件,此时如果可以正常解析出,那么就是压缩,否则即为加密。

┌──(kali㉿kali)-[~/Desktop/22-11]
└─$ binwalk -Me FW110B02_FW_Encrypt.bin                                              
Scan Time:     2023-11-22 01:22:00
Target File:   /home/kali/Desktop/22-11/FW110B02_FW_Encrypt.bin
MD5 Checksum:  b4518c966ea67d61d666b95b5e740129
Signatures:    411
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
1391843       0x153CE3        QNX4 Boot Block                    
┌──(kali㉿kali)-[~/Desktop/22-11]
└─$

打开Unix文件系统目录,如下:

通过使用find命令,在当前文件夹下面寻找有关加密解密的文件,发现了一个目录下存在公钥文件./etc_ro/public.pem ,文件内容和结果如下:

┌──(kali㉿kali)-[~/Desktop/22-11/ExtratedFWUnencrpty]
└─$ find ./ -name *pem
./etc_ro/public.pem       
┌──(kali㉿kali)-[~/Desktop/22-11/ExtratedFWUnencrpty]
└─$ cat ./etc_ro/public.pem
-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAgEApZLuH2XFDWuazEMpx4v6QY0ePRJm344JgkLKfeofovxvbjfX6RHU
7yUz6b2wJnW4lomEzjrJEQFnPGNFV/oWO/NaTb3k0rPUewDzlzy/pn7ZMehqnMK1
tHVnyQ6RZ+9qkdYEu08f79UgZcGQzSy2TLNMquAB9ffGbTHAjRfoK7cDjQX+RKWh
OOs5tbnzhR0B4Jdd6UL9Sqoq5UisTdlnFhy67RdsItz3OOrHIiDYmfkEOqAZySKZ
MhY7h7kkC8t1IzZOncBx3LYU4PMo9ulycAx7xDUric8xswnKoYAJbbKtp9xnGKRJ
HPuZOZyXFdWNlTVhzG3sGdDzcpHxrFOJZ5RK/n19DArbq6w9MEInTmU3bcwDYFvX
JCQ5Al05lgqP8vk7U4xx3AcwZUQHNVzduBuibB26jhpPXSk1Cl6NpFdXlKvcynfV
H8XaCHy8LXhZBMiuR62Ft6YkcIpBdsQ2uBGL5GOmVFA/cOEtPZjWxzN/miXaZ7In
iRhXEHFus6zYIPOTa9DNyAA87UCqxkem7Xgu59fgq49YwGPk+Q7HJXKgts9QTn9y
26OtlUAq1i23EJK6GJvTmszslXbAWEi5Mlb/o7QdpEQt/gyz9udnVmfXOy4UmNXN
ZxuVyXNomTBFRObZ5Zmn6n+xat5eBDpvct+OO1IUMC154div9i2szF0CAwEAAQ==
-----END RSA PUBLIC KEY-----         
┌──(kali㉿kali)-[~/Desktop/22-11/ExtratedFWUnencrpty]
└─$

再次通过使用find命令,在当前文件夹下面寻找有关加密解密的文件,没有找到有关encrypt的文件,但发现了./bin/目录下存在一个imgdecrpyt文件,根据文件名猜测可能是用于解密有关的文件。

┌──(kali㉿kali)-[~/Desktop/22-11/ExtratedFWUnencrpty]
└─$ find ./ -name *encrypt          
┌──(kali㉿kali)-[~/Desktop/22-11/ExtratedFWUnencrpty]
└─$ find ./ -name *decrypt
./bin/imgdecrypt         
┌──(kali㉿kali)-[~/Desktop/22-11/ExtratedFWUnencrpty]
└─$

将这个文件使用十进制编辑器打开查看,文件开头为7F 45 4C 46,说明是ELF文件格式。

ELF文件简述:

前4个字节是ELF的Magic Number,固定为7f 45 4c 46
第5个字节指明ELF文件是32位还是64位的。
第6个字节指明了数据的编码方式。
第7个字节指明了ELF header的版本号,目前值都是1。
第8-16个字节,都填充为0。

下面将这个文件使用Ghidra打开,逆向查看是否包含加密或解密逻辑。

发现使用Ghidra很够很好的将加密逻辑函数和解密逻辑函数反编译了出来,发现了解密函数decrypt_firmar和加密函数encrypt_firmare,同时在解密函数中发现了local_20 = "/etc_ro/public.pem",这个函数和文件正是要解密的关键。

解密函数如下:

int decrypt_firmare(int param_1,undefined4 *param_2,undefined4 param_3,undefined4 param_4)

{
  int iVar1;
  char *local_20;
  int local_1c;
  undefined4 local_18;
  undefined4 local_14;
  undefined4 local_10;
  undefined4 local_c;

  local_18._0_1_ = '0';
  local_18._1_1_ = '1';
  local_18._2_1_ = '2';
  local_18._3_1_ = '3';
  local_14._0_1_ = '4';
  local_14._1_1_ = '5';
  local_14._2_1_ = '6';
  local_14._3_1_ = '7';
  local_10._0_1_ = '8';
  local_10._1_1_ = '9';
  local_10._2_1_ = 'A';
  local_10._3_1_ = 'B';
  local_c._0_1_ = 'C';
  local_c._1_1_ = 'D';
  local_c._2_1_ = 'E';
  local_c._3_1_ = 'F';
  local_20 = "/etc_ro/public.pem";
  if (param_1 < 2) {
    printf("%s <sourceFile>\r\n",(char *)*param_2);
    iVar1 = -1;
  }
  else {
    if (2 < param_1) {
      local_20 = (char *)param_2[2];
    }
    iVar1 = FUN_0040215c(local_20,(void *)0x0);
    if (iVar1 == 0) {
      FUN_00402554((uchar *)&local_18);
      printf("key:");
      for (local_1c = 0; local_1c < 0x10; local_1c = local_1c + 1) {
        printf("%02X",(uint)*(byte *)((int)&local_18 + local_1c));
      }
      puts("\r");
      iVar1 = FUN_00401780((char *)param_2[1],"/tmp/.firmware.orig",(uchar *)&local_18);
      if (iVar1 == 0) {
        unlink((char *)param_2[1]);
        rename("/tmp/.firmware.orig",(char *)param_2[1]);
      }
      RSA_free(DAT_004131c0);
    }
    else {
      iVar1 = -1;
    }
  }
  return iVar1;
}

从上面的printf("key:")到puts("\r"),首先输出字符key:,然后在for循环中使用了pringf函数,,可以发现中间的for循环就是输出的key的结果,这个key后面用来解密固件,然后put函数输出字符表示截断,类似输出key的结果样式如下:

key:xxxxx

可以发现local_1c就是循环的变量,所以不影响上下文的情况下,选中变量,然后按住L快捷键,输入num,修改为num变量,更加的解释代码。

该段代码的作用是打印出 "key:" 后面跟着 local_18 数组中每个字节的十六进制形式。因此local_18 是一个存储密钥的数组。

这段代码的逻辑如下:

  1. printf("key:"); - 打印字符串 "key:"
  2. for (num = 0; num < 0x10; num = num + 1) - 循环从 0 到 15 的数字,每次迭代增加 1,使用 num 作为循环变量。
  3. printf("%02X",(uint)*(byte *)((int)&local_18 + num)); - 在循环中,以十六进制的形式打印 local_18 变量中存储的值。在这里,将 local_18 中第 num 个字节的内存地址强制转换为 byte 类型指针,并在取得该地址对应的值后,以 %02X 的格式进行打印。这样可以以两个十六进制数字的形式打印每个字节的值。
  4. puts("\r"); - 打印一个回车符,换行一行。

下面解释函数FUN_00402554((uchar )&local_18),因为这是唯一一个涉及变量的函数,双击进入函数查看,此函数的功能是增加了一个uchar param_1参数,函数体内容是调用了函数FUN_0040108c。

到这里就可以了,查看函数FUN_0040108c,可以发现了存在AES解密逻辑和AES加密逻辑,至此分析函数FUN_00402554的参数和调用逻辑即可分析出密钥key。

总共有5个参数,第一个参数的获取方法,选中函数第一个参数,双击进入:

0040256c 20 00 44 24   addiu                  param_1=>DAT_00402e78,v0,0x20                    = C8h

选中文字,然后右键,点击Copy Special,复制格式为Python Byte String。

结果为:b'\xc8\xd3\x2f\x40\x9c\xac\xb3\x47\xc8\xd2\x6f\xdc\xb9\x09\x0b\x3c'

第二个参数为0x10,即十进制数16,在这个函数中代表长度为16。

第三个参数为AES加解密的key,选中,双击进入。

00402598 21 30 60 00   move                    a2=>DAT_00402e68,v1    = 35h    5

这条指令是 move 指令,用于将一个寄存器的值复制到另一个寄存器。根据指令的格式和给出的参数,可以解析该指令的含义如下:将存储在寄存器 a2 中的值复制到寄存器 v1 中。同时,该指令的注释中提到,这个操作将值 35h (53) 复制到了位置为 DAT_00402e68 的内存数据中。

然后同样的选中,右键选择Copy Special选项,然后选择Byte String(No Spaces),取出去除空格之后的字符串。

得到第三个参数结果为:358790034519f8c8235db6492839a73f。

第三个参数为AES加解密的向量IV值,选中,双击进入。

0040259c 21 38 40 00   move    a3=>DAT_00402e58,v0     = 98h

move 指令是 MIPS 汇编中用于将一个寄存器的值复制到另一个寄存器的操作。根据指令的格式和给出的参数,该指令执行了以下操作:

将存储在寄存器 a3 中的值复制到寄存器 v0 中。

第四个参数结果为IV值:98c9d8f0133d0695e2a709c8b69682d4

OpenSSL是一个开源的加密工具包,支持多种加密算法和协议。使用OpenSSL进行加密和解密的过程如下:

加密过程:

  1. 选择适当的加密算法和模式,如AES(Advanced Encryption Standard)。
  2. 生成加密使用的密钥。
  3. 选择适当的初始化向量(IV)。
  4. 使用选择的加密算法、密钥和IV对明文数据进行加密。
  5. 可选:对密文进行填充以满足加密算法的要求。
  6. 输出密文数据。

    解密过程:

  7. 使用与加密过程相同的加密算法、密钥和IV。

  8. 使用相同的填充方式解除填充(如果有的话)。
  9. 对密文数据进行解密。
  10. 输出解密后的明文数据。

根据解密过程和上面得到的参数,将16进制的字符串密文数据,使用指定的密钥和初始化向量进行AES-128解密(CBC模式),然后将解密后的结果以16进制表示进行输出,输入如下面命令可以获得解密的密钥的十六进制格式,

printf "\xc8\xd3\x2f\x40\x9c\xac\xb3\x47\xc8\xd2\x6f\xdc\xb9\x09\x0b\x3c" | openssl aes-128-cbc -d -nopad -K "358790034519f8c8235db6492839a73f" -iv "98c9d8f0133d0695e2a709c8b69682d4" -in - | hd

输出密钥为:c0 5f bf 19 36 c9 94 29 ce 2a 07 81 f0 8d 6a d8

  1. openssl aes-128-cbc -d -nopad -K "358790034519f8c8235db6492839a73f" -iv "98c9d8f0133d0695e2a709c8b69682d4" -in -:这是使用OpenSSL进行解密的命令。
    • openssl aes-128-cbc:选择使用AES-128和CBC模式进行解密。
    • -d:表示进行解密操作。
    • -nopad:表示没有填充,即明文长度必须是块大小的倍数。
    • -K "358790034519f8c8235db6492839a73f":指定密钥,使用16进制字符串表示。
    • -iv "98c9d8f0133d0695e2a709c8b69682d4":指定初始化向量(IV),同样使用16进制字符串表示。
    • -in -:指定输入数据为先前的管道输出。-表示从标准输入读取,注意不能缺少最后的横杠,否则表示不正确输入。
  2. | hd:将解密后的二进制数据通过管道传输符号转换为16进制表示并进行输出。hd是一个十六进制转储命令。

另一种则是使用强大的加解密网址,注意选择十六进制输入格式,与输出格式。

https://gchq.github.io/CyberChef/#recipe=AES_Decrypt(%7B'option':'Hex','string':'358790034519f8c8235db6492839a73f'%7D,%7B'option':'Hex','string':'98c9d8f0133d0695e2a709c8b69682d4'%7D,'CBC/NoPadding','Hex','Hex',%7B'option':'Hex','string':''%7D,%7B'option':'Hex','string':''%7D)&input=YzhkMzJmNDA5Y2FjYjM0N2M4ZDI2ZmRjYjkwOTBiM2M

执行结果如下:


获取该密钥之后,就能解密无法使用binwalk解析的固件系统了,不过除了逆向,又学习了另一种使用真实环境模拟的方法,来解密获取密钥key。

使用命令sudo apt install qemu-user-static下载安装qemu静态文件。

然后使用命令readelf -h ./bin/imgdecrypt 查看imgdecrypt文件的格式,得到结果为MIPS架构,32位,小端序。

识别为MIPS架构小端序后,即可选择对应的qemu模拟环境文件,使用命令cp /usr/bin/qemu-mipsel-static .复制到当前类Unix目录下执行如下。

然后使用命令sudo chroot . ./qemu-mipsel-static ./bin/imgdecrypt针对特定的文件,模拟执行环境,执行结果如下:

可以得到我们的密钥结为:key:C05FBF1936C99429CE2A0781F08D6AD8,也就是我们把需要解密的固件放在后面就可以执行处密钥的结果。这种方法显然更加快捷,不过逆向方法也更加通用。

┌──(kali㉿kali)-[~/Desktop/22-11/ExtratedFWUnencrpty]
└─$ sudo chroot . ./qemu-mipsel-static ./bin/imgdecrypt FW110B02_FW_Encrypt.bin 
key:C05FBF1936C99429CE2A0781F08D6AD8

下面开始分析加密固件FW110B02_FW_Encrypt.bin的文件系统和解密固件过程。使用十六进制编辑器查看,固件加密格式分为以下几个部分:

1.固件的特征码为53 48 52 53 00

2.解密区域大小为00 9D 2B 00

3.加密块大小为:

下面开始使用dd命令来提取出加密区域

┌──(kali㉿kali)-[~/Desktop/22-11]
└─$ dd iflag=skip_bytes,count_bytes if=/home/kali/Desktop/22-11/FW110B02_FW_Encrypt.bin of=/home/kali/Desktop/22-11/Bin_Encrpted.bin skip=1756 count=13265600         
25909+1 records in
25909+1 records out
13265600 bytes (13 MB, 13 MiB) copied, 0.179841 s, 73.8 MB/s

然后使用sha512sum命令计算分离出来的bin文件的sha512值为:2811f78bfbba012498500127c98cfa9b2f74035530c1199768aad2b02aed1b78c1ccc7692aa27326cdcd67a9ce6c9df92a6557f39a4ba73022147b86336a6fb1,与文件结构中的结果一致,分离验证正确。

┌──(kali㉿kali)-[~/Desktop/22-11]
└─$ sha512sum Bin_Encrpted.bin     
2811f78bfbba012498500127c98cfa9b2f74035530c1199768aad2b02aed1b78c1ccc7692aa27326cdcd67a9ce6c9df92a6557f39a4ba73022147b86336a6fb1  Bin_Encrpted.bin

使用OpenSSL工具对文件 "Bin_Encrpted.bin" 进行 AES-128-CBC 解密的操作:

使用命令:openssl aes-128-cbc -d -p -nopad -nosalt -K C05FBF1936C99429CE2A0781F08D6AD8 -iv 67C6697351FF4AEC29CDBAABF2FBE346 --nosalt -in Bin_Encrpted.bin -out Bin_Decrpted.bin

  • -d:表示进行解密操作。
  • -p:表示打印出解密结果之前的信息,包括解密算法、密钥和初始化向量等。
  • -nopad:表示不进行填充操作。这意味着,被解密的文件必须是加密时使用了填充的。
  • -nosalt:表示在解密过程中不使用盐值。
  • -K C05FBF1936C99429CE2A0781F08D6AD8:指定解密所需的密钥。密钥是以十六进制格式给出的。
  • -iv 67C6697351FF4AEC29CDBAABF2FBE346:指定解密所需的初始化向量。初始化向量同样也是以十六进制格式给出的。
  • -in Bin_Encrpted.bin:指定待解密的文件名为 "Bin_Encrpted.bin"。
  • -out Bin_Decrpted.bin:指定解密后的文件名为 "Bin_Decrpted.bin"。

注意此处使用的key=27CFF066D55FBF75A37CC766D338AAD8,
iv=67C6697351FF4AEC29CDBAABF2FBE346需要与结果中对应。比如如果使用小写的-k参数,那么得到的结果为如下,无法正确提取固件,key和iv执行过程和结果必须为一样的,否则无法完成后面的SHA512校验,下图为错例:

然后下一步获取文件:Bin_Firmware.bin。

使用命令echo $((0x00CA6ABB))得到十进制的获取文件总字节数。

然后使用dd命令:dd iflag=skip_bytes,count_bytes if=Bin_Decrpted.bin of=Bin_Firmware.bin count=13265595得到文件Bin_Firmware.bin。

接下来使用sha512sum命令验证提取的固件是否正确,与原始的文件中得校验数字对比一致,表示成功。

下一步需要通过执行该命令,会将十六进制字符串所表示的数据进行解析,并将解析后的二进制数据追加写入 "Unencrypted_Firmware".bin。

"C05FBF1936C99429CE2A0781F08D6AD8" 的字节表示转换为二进制数据,并将结果追加到名为 "Unencrypted_Firmware.bin" 的文件中。

  • perl -e:表示执行Perl脚本
  • 'print pack "H*", "C05FBF1936C99429CE2A0781F08D6AD8"'是 Perl代码,此处使用print pack函数将十六进制字符串转换为二进制数据。
    • pack 函数用于将给定格式的数据打包为二进制字符串。
    • "H*"pack 函数的格式字符串,指示以十六进制字符串的形式输入数据。
    • "C05FBF1936C99429CE2A0781F08D6AD8" 是输入的十六进制字符串数据。

此时,再是用十六进制编辑器,查看右侧ASCII字符能够识别到正确的Linux系统,故成功解密。

至于为什么最后追加这段key作为二进制数据,相当于在重新打包的时候必须有正确的签名,否则会导致解密失败,是比较关键一步。

下面将解密的固件重命名为Unencrypted_Firmware.bin,并且和原始加密的中值进行验证对比,发现结果一致,表示验证正确。

值为:0a4ecafa69291d786b3f7e35080a820732b9bb799ebaeedf431c818afd0d5f08d726a37a3683649562e6636d8333a11e5be1f44da36f1d3e67af08720bba692f

接下来使用binwalk解析出linux文件系统,执行成功,结果如下:

将如下加密固件,解密固件以及解析的文件系统打包为附件,提供参考。

前面使用的加密固件二进制格式分析如下:

首先是魔数字节,然后依次是固件解密区域大小,加密区域大小,IV值,解密固件区域和key的SHA512值,单独的解密固件区域SHA512值,加密区域的SHA512值,未使用区域,解密区域使用的算法,加密区域使用的算法,加密区域开始到加密区域结束,以及最后的填充区域。

魔数字节为:53485253

固件解密区域大小值为:00CA6ABB

加密区域大小值为:00CA6AC0

IV值为:67C6697351FF4AEC29CDBAABF2FBE346

解密固件区域和key的SHA512值长度为64字节,值为:

0A 4E CA FA 69 29 1D 78 6B 3F 7E 35 08 0A 82 07 32 B9 BB 79 9E BA EE DF 43 1C 81 8A FD 0D 5F 08 D7 26 A3 7A 36 83 64 95 62 E6 63 6D 83 33 A1 1E 5B E1 F4 4D A3 6F 1D 3E 67 AF 08 72 0B BA 69 2F

单独的解密固件区域SHA512值长度为64字节,值为:

A3 24 8F F2 A0 CD 3B 7F 04 40 A0 71 89 D2 0A 0D ED D4 E7 D2 DC 8C 4E 88 7D 7D D4 61 09 C1 3A 1D 3A AD 7B 8F AC A4 49 A3 C3 C7 65 A3 74 F8 1D 68 DC A3 6E EE F4 E4 92 3C B0 4F 56 15 92 F8 57 C5

加密区域的SHA512值长度为64字节,值为:

28 11 F7 8B FB BA 01 24 98 50 01 27 C9 8C FA 9B 2F 74 03 55 30 C1 19 97 68 AA D2 B0 2A ED 1B 78 C1 CC C7 69 2A A2 73 26 CD CD 67 A9 CE 6C 9D F9 2A 65 57 F3 9A 4B A7 30 22 14 7B 86 33 6A 6F B1

未使用区域值为:

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00....

解密区域使用的算法有512字节,值为:

99 FD B9 AD A4 58 2D 79 89 70 A2 C7 6E E2 46 F0 69 FE 00 6A B3 7C 7D 8D C4 0C 66 77 C1 76 E9 80 A4 2B 8B 05 7C 98 3C AF 0A 30 5C B0 13 C1 F2 7B 7A 61 01 6C BF B3 89 14 42 1F 4F AA 04 81 5E F5 04 30 A8 26 2F 1F 66 90 FC 07 30 AB 09 06 82 CC 44 51 C7 BF 82 13 0B 5C 41 1D AE 24 E2 4A C3 64 39 BC 10 FD C2 CB 45 59 D5 AB B8 6A E2 B2 26 AF 54 DA 0F 20 65 6A B4 E3 65 B3 32 B6 9E 52 EB E6 E2 63 1C 9F B2 63 94 EA 92 4D 39 78 CA A2 1D 6F FB 3B FD C6 42 E2 04 FF EC 62 AE 8C 29 04 B4 84 E8 C8 33 5E 6B 29 85 D2 3B A1 5F D3 C8 0B E8 D1 7D 51 1A 5F 54 B8 FE 47 6B B7 18 A0 57 4E BE 5C 75 C9 06 0D C0 CA A4 21 92 6B FD BE F4 70 C7 8A 0E CE BA E3 C0 BF 75 64 7D B7 EE A8 B4 08 7A 6E 23 B9 3B 3E 93 24 6B F8 13 50 13 61 B8 6C 0B D4 50 86 A1 FC 62 3C 95 0E 29 E9 09 0F 51 8C 76 79 8E 6D 3B 16 BC 91 9C A6 09 C8 DC C8 B4 A1 0A 0C E8 21 D4 9F C5 91 20 FC 5D 6C 84 98 F5 60 40 A8 2B 4E B8 F0 48 2D 25 F7 17 AD 1C A5 D9 C8 5B 39 91 74 2E F8 24 4A 60 F5 4F FB A7 98 1E 74 E8 CF 10 E0 C0 AC 41 C7 06 40 04 19 73 43 0C A4 96 2E 6F 14 20 38 C0 FE 7B 75 10 58 32 BA 5F C4 4A 48 F1 76 0C 48 BA D7 53 D3 5B AC 24 7B 19 7D 6D 1C 97 B1 1D 81 9C F2 0B C1 5B 4E 3A 21 E3 B6 6F 5D 54 2E 72 22 25 C1 F5 A1 90 79 FB CE E1 D5 AB AD 1F 08 B3 55 10 E1 1E 86 88 BD A3 6F DC 0C 00 43 A1 71 39 39 F5 1C EE B5 2C B5 72 49 FD 24 C7 9A 7B 1A 05 84 50 E5 D1 FA 2E 44 A3 C6 3F 63 07 80 21 B2 02 75 D3 90 1F 3A 35 85 25 8D C6 3A C1 72 31 E3 08 F0 6C 7D 6E CD 8B 5C 04 48 DB 32 30 70 F5 D5 CB D1 1A 2F 8D B7 25 79 8D C6 38 08 3B 95 6C A4 0D 08 B6 CA 2A FD DF 6B EF 38 80 A5 0C C4

加密区域使用的算法有512字节,值为:

2F B1 8D 7E B2 66 51 F8 93 E5 5A A3 90 BB D3 86 80 24 DE F0 FB 8A 5C 37 BB 9F 8D 49 D4 6E 02 B3 73 63 F4 FC 85 6D E1 E7 CA C0 03 6C AB F6 01 47 27 FC 54 C5 37 4F 87 25 38 D7 5E 0C 45 0C 42 2B 6B 72 79 C8 13 D6 11 D1 39 E0 59 8A 8B A8 0C AF 59 F9 4C D3 A2 62 CE F0 A2 84 DE BB DE 9E CA 98 AB DB D1 4D 2B 7E 04 B5 A3 33 B2 D5 3B A0 BA 71 75 0E 9E 75 C2 D1 36 58 C5 F0 36 ED D9 4B BC 31 EA 1B A0 72 13 4E 40 82 40 E2 87 25 49 71 97 C5 83 04 71 12 F2 9F 77 D5 90 2E A2 F8 8D B0 8F 97 83 9A 08 4E 22 AD AD 24 35 CE 90 F2 D7 9F B3 2E C1 94 3B 8D 0E 68 CB 3C 43 30 1F 47 D0 13 82 EB 1F 0D 0A 31 A4 AA E0 85 3C B4 72 79 87 BC 31 E1 3C E0 A0 C4 C0 EF 67 6C 58 6A 2C 59 A5 A1 EF 5C 7B 6D 69 5E 22 E1 BA 96 7C F2 04 F0 97 98 0F AC 68 8E 48 3A 8C 38 DC 43 40 19 3D 73 82 B0 3E 98 8F 85 0E 16 43 56 BB E1 17 4F 61 3B 76 0A 97 45 F4 13 BE CF 6B 85 DD 21 A7 F7 4A 2D 31 88 FF 1A E9 17 7C BD 1C 41 C7 97 96 57 84 96 9C A7 1A 7B 33 A7 CA 96 EF 49 04 C6 6B E4 EE 8C 15 8E 7A 41 A8 BB 48 DE DF 58 A2 EE 3B F3 02 53 C9 B5 E1 98 20 40 F9 ED 5C 5A 2B F2 B4 62 9B BB 58 8C F8 0E 37 D2 DE 11 77 01 47 13 3B FD 43 79 3E 03 77 22 8A 51 40 EF 98 B1 01 9F 3A 20 ED E6 2A 3C 9F A4 B9 63 57 F2 E8 65 6B 7F 0A 23 15 53 97 8C 81 E1 35 31 14 13 C8 3D F1 AE 66 B8 05 88 44 97 04 E7 9C E9 2D A3 5D 9B FE AD 83 DC 20 1B 1D 02 E0 B9 91 8D CD 96 0B D8 8C C1 AE A0 EC BE 2F 8D 21 85 53 E4 38 2F 88 CD CE E5 99 3F B9 96 54 BD B7 3B AB 9D 0C 0C A1 66 EE B5 D9 26 8E B5 76 24 FC 9F 6B F9 FA E8 3D 05 E9 D8 3D 33 9E 01 2C 8C 5C F7 30 16 94 19 01 FB B2 5A 5B 59 D4 F9 62 8E 9B CF

填充的值为长度为64字节,值为:0000000000000000000030。

整个完整的固件解密过程即如上所示。


文章来源: https://xz.aliyun.com/t/13098
如有侵权请联系:admin#unsafe.sh