算是弥补了去年的遗憾了

去年的Long Range 1 的 wp

拿到手一个lora的wav和一个flash_dump

根据去年的经验先把lora秒了

SDRConsole打开音频

基本参数直接到手,再加上文件名,基础参数如下

采样率: 1M
频段:375M
带宽: 375128.425k-374869.675k 约为 250k

然后直接就是一个gnuradio-companion,启动

简单起个解密

参数往里一填

扩散因子6-12手动试试这里只有11的时候才有东西能解出来

前面repeat就不用开了,解密得到的信息如下

 2d 31 e0 bc 4b 6c fa c4 c0 6d fa 66 26 d2 02 0b 08 a7 92 b3 78 fb 63 77 d7 e0 54 d7 4f 67 1e c0 2d f1 8c 7d 04 66 c9 31 bb 22 40 0f c9 ec 25 c8 71 33 (Klmf&xcwTOg-}f1"@%q3)
 1b 31 e0 c4 c0 6d fa bc 4b 6c fa 29 5d 91 38 03 08 a7 92 12 19 7e 5e 99 47 1a 63 33 0f d5 24 55 (mKl)]8~^Gc3$U)
 49 31 20 c4 c0 6d fa bc 4b 6c fa a6 41 be 1e 0b 08 a7 92 b9 4d 99 11 17 1c a9 be 15 47 44 0f f1 d6 ce 46 02 e2 d2 a4 11 af e6 da e9 f2 0c db d0 5e e5 04 3b 82 cd 6c 79 47 31 94 f9 79 73 d9 0c 85 b3 09 8c c7 22 73 85 64 36 c8 be 0a de (mKlAMGDF^;lyG1ys"sd6)
 1b 31 e0 bc 4b 6c fa c4 c0 6d fa 0f 21 39 44 03 08 a7 92 b8 56 c7 f0 c5 8e 43 63 70 27 c9 75 2d (Klm!9DVCcp'u-)
 5f 30 00 ff ff ff ff c4 c0 6d fa a3 f3 0f 12 03 08 a7 92 aa c1 8d 79 d8 3c 56 bc 10 34 5a ea 0f cc 82 91 41 29 1c 63 01 cc 6e 23 15 f6 a1 0f 72 20 b9 5d f1 88 c5 e5 0b ec ec 89 cb 54 b5 40 6e c1 83 c1 b7 bf 77 5e 6b ff 15 0d aa 09 c8 3d 6c 98 4f 70 c9 e2 dc 26 97 2f 84 e0 5c ba e7 5a 89 51 d4 cd 2f (my<V4ZA)cn#r ]T@nw^k=lOp&/\ZQ/)
 5f 30 00 ff ff ff ff c4 c0 6d fa a3 f3 0f 12 02 08 a7 92 aa c1 8d 79 d8 3c 56 bc 10 34 5a ea 0f cc 82 91 41 29 1c 63 01 cc 6e 23 15 f6 a1 0f 72 20 b9 5d f1 88 c5 e5 0b ec ec 89 cb 54 b5 40 6e c1 83 c1 b7 bf 77 5e 6b ff 15 0d aa 09 c8 3d 6c 98 4f 70 c9 e2 dc 26 97 2f 84 e0 5c ba e7 5a 89 51 d4 d7 b3 (my<V4ZA)cn#r ]T@nw^k=lOp&/\ZQ)
 2d 31 e0 ff ff ff ff bc 4b 6c fa ed bb 63 1c 03 08 a7 92 c9 4d 34 c5 67 d1 39 89 47 9d 37 6c 8a 0c ac dc 65 8d 12 56 4a 93 ef 74 00 25 44 37 ac 10 56 (KlcM4g9G7leVJt%D7V)
 2d 31 e0 ff ff ff ff bc 4b 6c fa ed bb 63 1c 02 08 a7 92 c9 4d 34 c5 67 d1 39 89 47 9d 37 6c 8a 0c ac dc 65 8d 12 56 4a 93 ef 74 00 25 44 37 ac 39 d8 (KlcM4g9G7leVJt%D79)
 1f 31 40 ff ff ff ff bc 4b 6c fa a6 20 df 2d 03 04 a7 92 5a fa cd 43 97 76 00 36 1b 8c c3 f5 0f bd 5d 65 2e (Kl -ZCv6]e.)
 1f 31 40 ff ff ff ff bc 4b 6c fa a6 20 df 2d 02 04 a7 92 5a fa cd 43 97 76 00 36 1b 8c c3 f5 0f bd 5d 87 3e (Kl -ZCv6]>)
 68 30 60 ff ff ff ff c4 c0 6d fa 88 99 c2 02 03 04 a7 92 50 01 50 2e 35 d7 3a b7 93 c3 e9 ad 6a cc 9d a6 a4 95 5b c5 6b 80 54 e9 98 9d 76 f5 35 5c f2 86 8b 90 bf fa e3 21 d5 10 77 be 4e 17 74 fc 07 4f 63 a4 c0 af 6b a3 8f 33 a8 29 b0 78 4b da db cc 73 8b 16 e9 30 e7 41 c4 8f 4d 6c 0c ab 01 2e 56 05 12 2d ce 40 ea eb 7b 76 26 (mPP.5:j[kTv5\!wNtOck3)xKs0AMl.V-@{v&)
 68 30 60 ff ff ff ff c4 c0 6d fa 88 99 c2 02 02 04 a7 92 50 01 50 2e 35 d7 3a b7 93 c3 e9 ad 6a cc 9d a6 a4 95 5b c5 6b 80 54 e9 98 9d 76 f5 35 5c f2 86 8b 90 bf fa e3 21 d5 10 77 be 4e 17 74 fc 07 4f 63 a4 c0 af 6b a3 8f 33 a8 29 b0 78 4b da db cc 73 8b 16 e9 30 e7 41 c4 8f 4d 6c 0c ab 01 2e 56 05 12 2d ce 40 ea eb 7b e2 d3 (mPP.5:j[kTv5\!wNtOck3)xKs0AMl.V-@{)
 22 31 70 ff ff ff ff c4 c0 6d fa 5f 8a 54 22 03 04 a7 92 53 1f 89 a3 6f ea 30 18 c9 ce b7 e7 1f a3 cd 72 71 ed 14 0f (m_T"So0rq)
 22 31 70 ff ff ff ff c4 c0 6d fa 5f 8a 54 22 02 04 a7 92 53 1f 89 a3 6f ea 30 18 c9 ce b7 e7 1f a3 cd 72 71 ed a7 3a (m_T"So0rq:)
 09 11 40 09 11 40 ff c4 c0 6d fa 5f 8a 54 (@m_T)
 09 11 40 ff c4 c0 6d fa 5f 8a 54 (@m_T)

这次就不是明文了,看起来像某种协议

然后根据上次的经验,开头三个和结尾两个应该是他的lora的固有格式,去掉即可,于是报文可以写成下面这样

bc4b6cfac4c06dfa6626d2020b08a792b378fb6377d7e054d74f671ec02df18c7d0466c931bb22400fc9ec25c8
c4c06dfabc4b6cfa295d91380308a79212197e5e99471a63330fd5
c4c06dfabc4b6cfaa641be1e0b08a792b94d9911171ca9be1547440ff1d6ce4602e2d2a411afe6dae9f20cdbd05ee5043b82cd6c79473194f97973d90c85b3098cc72273856436c8be
bc4b6cfac4c06dfa0f2139440308a792b856c7f0c58e43637027c9
ffffffffc4c06dfaa3f30f120308a792aac18d79d83c56bc10345aea0fcc829141291c6301cc6e2315f6a10f7220b95df188c5e50becec89cb54b5406ec183c1b7bf775e6bff150daa09c83d6c984f70c9e2dc26972f84e05cbae75a8951d4
ffffffffbc4b6cfaedbb631c0308a792c94d34c567d13989479d376c8a0cacdc658d12564a93ef7400254437ac
ffffffffbc4b6cfaa620df2d0304a7925afacd43977600361b8cc3f50fbd5d
ffffffffc4c06dfa8899c2020304a7925001502e35d73ab793c3e9ad6acc9da6a4955bc56b8054e9989d76f5355cf2868b90bffae321d51077be4e1774fc074f63a4c0af6ba38f33a829b0784bdadbcc738b16e930e741c48f4d6c0cab012e5605122dce40eaeb7b
ffffffffc4c06dfa5f8a54220304a792531f89a36fea3018c9ceb7e71fa3cd7271ed

然后就是对于flash_dump的分析了

直接就是记事本打开,可以发现里面出现了几个奇怪的api

google一下,得知是https://meshtastic.org/这个玩意

于是重点就可以放在翻他的文档以及源码来解析报文上面了

并且根据https://meshtastic.org/docs/overview/mesh-algo,发现格式也确实对的上

根据https://meshtastic.org/docs/overview/encryption可以知道他其实用的就是aes-ctr,密钥是128或256位的

然后就是翻源码翻了一整天,这里不再多说了,直接说下关键位置

首先是默认psk,也就是加密使用的默认密钥

d4f1bb3a20290759f0bcffabcf4e6901

然后是iv的生成,这里的iv就是nonce,规则如下

不难看出,iv就是id + \x00 * 4 + from + \x00 * 4

而根据上面的图,可以知道报文5-8字节为from-id,9-12字节为数据包id

那这样的话解密就简单了,先解第一条

然后就是整个前半段

I've got news for you, a.
It's not safe here, talk to me on the channel, idiot!
I've changed our studio's door key, i'm telling you now, don't let Bob know
stop here, wrong channel!

根据对话可得知channel改变,即key也改变,那么该如何得到key呢,我直接就是一手嗯搜,给的dump文件只有8m,跑的很快,而且这个channel上用了256位的密钥

exp:

from Crypto.Util import Counter
from Crypto.Cipher import AES
from tqdm import trange

nonce = bytes.fromhex("8899c20200000000c4c06dfa00000000")

f = open("flash_dump", 'rb').read()
for i in trange(len(f)):
    key = f[i:i+32]
    ctr = Counter.new(
        128, initial_value=int.from_bytes(nonce, byteorder='big'))
    cipher = AES.new(key, AES.MODE_CTR, counter=ctr)

    encrypted_data = bytes.fromhex(
        "5001502e35d73ab793c3e9ad6acc9da6a4955bc56b8054e9989d76f5355cf2868b90bffae321d51077be4e1774fc074f63a4c0af6ba38f33a829b0784bdadbcc738b16e930e741c48f4d6c0cab012e5605122dce40eaeb7b")
    try:
        decrypted_data = cipher.decrypt(encrypted_data)[4:].decode()
        print(key.hex())
        print(decrypted_data)
    except:
        continue

结果如下

顺手把下面的都解密了

here please
alright alright. the key is rwctf{No_h0p_th1s_tim3_c831bcad725935ba25c0a3708e49c0c8}
keep it secret

唉,去年从longrange1入门gnuradio以及各种信号,今年终于会做题了,令人感叹