D-link_DIR850l固件解密分析

新发布固件解密GhidraD-link
2024-09-12 19:09
7945

1、基础信息的简单收集

1.1、file&checksec&readelf

file busybox
checksec busybox
readelf -l busybox | grep GNU_STACK

image.png

我们可以看到这个固件的架构mips大端,且没开保护。

1.2、firmwalker

./firmwalker-pro-max.sh /home/iot/Desktop/gujian/D-link/dir850l/dir-850lb05/_jiemi.bin.extracted/squashfs-root

image.png

我们可以看到的是这个固件的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.")

image.png

这也就说明,我们面对异或加密的时候,只要我们拿到它的异或

试读结束,发布七天后转为公开

公开时间:2024年9月19日 19:09:24

提前解锁全文,需花费 50 积分

登录解锁全文
分享到

参与评论

0 / 200

全部评论 1

Nop的头像
学习了
2024-09-15 22:25
投稿
签到
联系我们
关于我们