一转眼都已经高三了, 学校的这几块班牌也被我折腾的不轻, 折腾途中也学会了不少东西.
后来一段时间没研究它, 花了好多时间在别的东西上, 技术也算有了不少进步.
正好我们新班主任一直觉得班牌放在外面看起来不方便, 于是我就又回来研究看看能有什么新的发现.
一句话概括一下我干的事: 逆向班牌本身通讯协议
班牌本身没有什么漏洞, 也把主程序作为了 Launcher, 也没开 adb, 虽说是个安卓机器, 但根本跳不出去.
于是就准备从逆向协议入手了.
0x00 获取网络通讯数据
要逆向并写出一个通讯协议肯定先要获取班牌的通讯数据啦.
尝试一: 硬件层面直接抓包
带了一个 OpenWRT 的路由器(HG 255D)到学校, 打算把原来接到班牌上的网线接到路由器上, 再从路由器上接出来到班牌上, 在路由器上用 tcpdump 抓取数据.
可后来发现”基础不牢地动山摇”是真的.(
有的时候对计算机网络了解的还不是特别透彻. OpenWRT 里那一堆设置搞不太定. 如果用 switch 模式的话数据根本不会被抓取到, 如果先让路由器本身连上网的话还要设置 DHCP 服务器(我们学校用的还是 10.52 的网段), 问题太多, 试起来又要把路由器拿来拿去太麻烦. 最后花了一个月成功地(?)失败了.
尝试二: ARP 欺诈
后来发现我们班级的电脑和班牌在同一个网段, 那直接 ARP 欺诈岂不是更方便.
在电脑上装了个虚拟机, 然后装了个 kali linux 就开始 arp spoofing.(具体过程就不赘述了. Google 上都有.)
还踩了一个坑: 之前没怎么用过 Wireshark, 开始看 Wireshark 抓到的数据一片黑色的 TCP Retransmission, 以为是 TCP 连接都没有建立成功. 研究了好久最后无意中发现数据已经抓到了.
0x01 逆向协议
本来我还以为班牌会用 http 协议, 结果发现它用的是 TCP 协议.
这还是我第一次逆向 TCP 协议呢.
抓到的包主要有这么两种: 真正发送数据的包和心跳包
1 | 数据包: |
服务器发送和客户端发送数据包的方式很相似. 所以就不分开列出了.
逆向的精髓只有两个字: 猜 & 试 (雾)
经过不断的尝试发现了数据包的规律:
开头的 2 byte 永远是 4e4d
接下来的 4 byte 是小端方式储存的数据包长度, 读出来是多少就往后读多少个 byte
接下来好像是固定的 01000001ffffffffffffffff
接下来依次是小端储存的 年 月 日 小时 分钟 秒 (为什么不用时间戳啊??)
接下来的 5 byte 客户端发送的时候如果是数据包则是 0100000000, 如果是心跳包则是 1b00000000, 服务器返回时则好像不符合此规则
接下来是真正的数据部分, 是 utf-8 编码的大端储存(为什么大小端还能在一个数据包里不一样啊??)的数据. 如果是心跳包发送的数据则是本机的 sn, 如果是数据包则是 json
最后 1 byte 则是固定的 00 作为结束
接下来就能发送和接收 json 格式的数据了, 逆向就比较简单了. (还好这里最后用了 json, 要不就更麻烦了…)
代码也写了个大概, 发在 Github 上了: https://github.com/lyc8503/IncichSchoolUtilities
接下来就能做一些有意思的事情了…?
本文采用 CC BY-NC-SA 4.0 许可协议发布.
作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/incich-third-3/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬