1、基础信息的简单收集
1.1、file&checksec&readelf
file busybox
checksec busybox
readelf -l busybox | grep GNU_STACK
我们可以看到这个固件的架构mips大端,且没开保护。
1.2、firmwalker
./firmwalker-pro-max.sh /home/iot/Desktop/gujian/D-link/dir850l/dir-850lb05/_jiemi.bin.extracted/squashfs-root
我们可以看到的是这个固件的web服务是httpd
2、解密
这个固件B版本是加密的,我们在网上可以看到这个固件的解密方法
知道这个的固件的加密是通过异或进行加密的,一个密钥是该设备的硬编码一个是【1-251】的循环。
下面是我们自己编写的解密源码。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import itertools
import sys
key1 = itertools.cycle(b'wrgac25_dlink.2013gui_dir850l')
key2 = itertools.cycle(range(1, 252))
with open(sys.argv[1], 'rb') as f:
fw = f.read() # fw 应该是字节类型
with open(sys.argv[2], 'wb') as f:
for i in range(0,len(fw)):
# 确保 fw[i] 是字节类型
f.write(bytes([fw[i] ^ next(key1) ^ next(key2)]))
# print(bytes([fw[i] ^ next(key1) ^ next(key2)]))
#print(len(fw))
f.close()
我们可以看到这个解密算法其实就是原加密字节与两个密钥进行异或,然后得到解密字节。
2.1、异或加密/解密的原理
举个例子
# 定义 A, B, C
A = 42 # 原始值 A
B = 15 # 原始值 B
C = 7 # 原始值 C
# 计算 D
D = A ^ B ^ C
print(f"Calculated D: {D}")
# 从 D 计算 A
A_calculated = D ^ B ^ C
print(f"Calculated A: {A_calculated}")
# 验证 A 是否正确
if A == A_calculated:
print("A is correctly calculated!")
else:
print("A calculation is incorrect.")
这也就说明,我们面对异或加密的时候,只要我们拿到它的异或