L3HCTF_REVERSE_WRITEUP

本文最后更新于:2021年11月18日 下午

hills

根据配置文件,得知是某公司的设备,网上找到设备固件,对其进行分析。

1
2
binwalk -Me xxxxx.bin
grep -rn "Hello" ./

image-20211115200926566

分析这两个文件。

其实跟了半天没跟出来在哪里加密,就挺菜的。根据文件里的函数名猜测,根据set_password找到aaa相关函数,然后发现set_password是libauth的导出函数,去分析,最后跟到了libauth.so中的libauth_epasswd_convert_2_plaintext。ghidra反编译的代码不是很容易读懂。

image-20211118161117888

关键加密就在此了。

1
2
3
4
5
6
7
8
1. 先进行b64解密,有36长度。然后去取32长度,后4长度作为一个值之后有用。
2. 将32长度的数据与key_param_array偏移0x10处的8个字节进行异或。
3. 设置key_param_array偏移0x18处位key。
4. key_param_array偏移0x0处与上方的4字节进行异或,设置为iv
5. 进行aes_cbc_decrypt。
6. 得到的输出与key_param_array偏移0x10处的8个字节进行异或,得到结果。

注意大端程序,所以dump出来的key_stream要每4字节进行倒序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import base64
from Crypto.Cipher.AES import *

def arr_to_byte(arr):
nbyte = ""
for i in range(len(arr)):
nbyte += chr(arr[i])
return nbyte.encode("latin")
#key_stream = [0xDC, 0xB0, 0x04, 0x30, 0x4B, 0x32, 0xDF, 0x7D, 0x9B, 0x45, 0xCB, 0xF7, 0x5A, 0x21, 0xBB, 0x31, 0xEB, 0xF8, 0x73, 0x1D, 0x97, 0x87, 0xC7, 0x26, 0x49, 0x62, 0x09, 0xF3, 0x9F, 0xA4, 0xDF, 0xA4, 0xAD, 0x7B, 0xDC, 0x33, 0xB6, 0xDA, 0x20, 0x67, 0x30, 0x04, 0xB0, 0xDC, 0x7D, 0xDF, 0x32, 0x4B]
key_stream = [0x30, 0x04, 0xB0, 0xDC, 0x7D, 0xDF, 0x32, 0x4B, 0xF7, 0xCB, 0x45, 0x9B, 0x31, 0xBB, 0x21, 0x5A, 0x1D, 0x73, 0xF8, 0xEB, 0x26, 0xC7, 0x87, 0x97, 0xF3, 0x09, 0x62, 0x49, 0xA4, 0xDF, 0xA4, 0x9F, 0x33, 0xDC, 0x7B, 0xAD, 0x67, 0x20, 0xDA, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
key = []
iv = []
inp = []
for i in range(16):
key.append(key_stream[0x18+i])
cipher_b64de = base64.b64decode(b"sOxxmnurlg68LoTgoBnO/lFTfJbuev+92GwwRPybFTZkPJhp")
cipher_32 = cipher_b64de[:32]
cipher_4 = cipher_b64de[32:]
for i in range(16):
iv.append(cipher_4[i % 4] ^ key_stream[i])
for i in range(32):
inp.append(cipher_32[i] ^ key_stream[0x10 + i%8])

iv_byte = arr_to_byte(iv)
key_byte = arr_to_byte(key)
inp_byte = arr_to_byte(inp)
print(iv_byte, key_byte)
aes = new(key_byte, MODE_CBC, iv_byte)
plaintext = aes.decrypt(inp_byte)
print(plaintext)
flag = ""
for i in range(len(plaintext)):
flag += chr(plaintext[i] ^ key_stream[0x10 + i%8])
print(flag)

ldap匿名登陆得到后半段flag。

image-20211118161702004

PswdTypee71sn00000tSaaf1}

idaaaaa


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!