小米IoT私有协议的漏洞挖掘尝试(十一)

尝试用发包的方式来让客户端进入新的逻辑,节省函数指针的间接引用所需要的大量静态分析时间。

于是,我修改补了一段畸形的http报文:

截图_2026-11-01_22-44-16.png

日志在开到最大的情况下,可以看到http_in_close函数,这是以前从未见过的,可以猜测得知这大概率是之前那几个结构体里的某个函数指针,在http_resp_body_recving进行了调用,进入了这段逻辑:

截图_2026-11-01_22-46-02.png

事实证明,httpdns成功接收了包。

但是光发包还不行,还得尝试让它有意义,而这里的jsmi_parse_start与一个名为cjson的库有关,这里恰好与我最初处理的json结构体联系起来,其恰好就是cjson的核心结构体jsmntok_t,其作用就是用扁平数组的方式来存储一个json字段。

截图_2026-11-01_22-50-06.png

截图_2026-11-01_22-50-16.png

大概逆向通读了一下http_in_close这个函数,发现它主要是在检查和接收几个键值对,于是尝试构造一段符合要求的json文本:

截图_2026-11-01_23-00-43.png

成功触发了http_in_close的校验逻辑,证明这种伪造是有效的,但是报错了enable disable,但是enable明明已经拼进了json字段中,猜测可能需要嵌套进去:

截图_2026-11-01_23-03-35.png

修改了enable的位置,这次没有字段缺失报错,显示了jsmi parse err,找到报错位置:

截图_2026-11-01_23-05-25.png

问题就出在jsmn_parse的返回值上,jsmn_parse同样是cjson的库函数,其作用是把第二个参数的字符串指针指向的json文本转化为tokens的形式(也就是之前所见的扁平数组)。

显然,jsmn_parse的返回值是一个负数错误码,进而引发了后续的问题,所以这里看一下具体是哪个状态码:

截图_2026-11-01_23-35-05.png

返回-2,表示的是“token数不足”,所以应该尝试减少json字段的嵌套深度,或者键值对数量,来强行把数据合法地塞进去。

评论