[班牌研究]高三-旅程再启(?)-新的技术,新的成果~

 

一转眼都已经高三了, 学校的这几块班牌也被我折腾的不轻, 折腾途中也学会了不少东西.

后来一段时间没研究它, 花了好多时间在别的东西上, 技术也算有了不少进步.

正好我们新班主任一直觉得班牌放在外面看起来不方便, 于是我就又回来研究看看能有什么新的发现.

一句话概括一下我干的事: 逆向班牌本身通讯协议

班牌本身没有什么漏洞, 也把主程序作为了 Launcher, 也没开 adb, 虽说是个安卓机器, 但根本跳不出去.

于是就准备从逆向协议入手了.

0x00 获取网络通讯数据

要逆向并写出一个通讯协议肯定先要获取班牌的通讯数据啦.

尝试一: 硬件层面直接抓包

带了一个 OpenWRT 的路由器(HG 255D)到学校, 打算把原来接到班牌上的网线接到路由器上, 再从路由器上接出来到班牌上, 在路由器上用 tcpdump 抓取数据.

可后来发现”基础不牢地动山摇”是真的.(

有的时候对计算机网络了解的还不是特别透彻. OpenWRT 里那一堆设置搞不太定. 如果用 switch 模式的话数据根本不会被抓取到, 如果先让路由器本身连上网的话还要设置 DHCP 服务器(我们学校用的还是 10.52 的网段), 问题太多, 试起来又要把路由器拿来拿去太麻烦. 最后花了一个月成功地(?)失败了.

尝试二: ARP 欺诈

后来发现我们班级的电脑和班牌在同一个网段, 那直接 ARP 欺诈岂不是更方便.

在电脑上装了个虚拟机, 然后装了个 kali linux 就开始 arp spoofing.(具体过程就不赘述了. Google 上都有.)

还踩了一个坑: 之前没怎么用过 Wireshark, 开始看 Wireshark 抓到的数据一片黑色的 TCP Retransmission, 以为是 TCP 连接都没有建立成功. 研究了好久最后无意中发现数据已经抓到了.

WiresharkWireshark

0x01 逆向协议

本来我还以为班牌会用 http 协议, 结果发现它用的是 TCP 协议.

这还是我第一次逆向 TCP 协议呢.

抓到的包主要有这么两种: 真正发送数据的包和心跳包

1
2
3
4
数据包:
4e4d2e00000001000001ffffffffffffffffe4070a1d101e0c1b000000007b22736e223a22333861323863366334616436227d00
心跳包:
4e4d1c00000001000001ffffffffffffffffe4070a1d101d351b0000000031313100

服务器发送和客户端发送数据包的方式很相似. 所以就不分开列出了.

逆向的精髓只有两个字: 猜 & 试 (雾)

经过不断的尝试发现了数据包的规律:

  • 开头的 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/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬