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

decomp2dbg插件不怎么稳定,经常出问题,但是IDA的动态调试又不支持pwndbg这么多功能,缺乏稳定好用的调试器一直让我浑身难受。

继续逆向。

对json的处理部分做了逆向,它维护了一个缓冲区,从fd里读字符,然后按照json格式循环解析,解析出一段完整的json就交给ot_agent_recv_handler_one使用。这里它的反编译结果不太友好,好几个while循环都被拆成了goto语句,耽误了一些时间。

QQ20260923-113641.png

QQ20260923-113658.png

然后沿着调用链一路往下追,找到了did not int字符串的引用点,但仔细比对后发现并不完全相同:

QQ20260922-231142.png

原来是交叉引用没展开:

QQ20260923-235603.png

跳转过去:

QQ20260923-090134.png

这里它根据sub_433DB4函数的返回值判断是否打印日志,但是sub_433DB4还涉及到一条更深入的函数调用链,所以这里直接上动态调试,只看函数参数,不探究来路和去向,在bl su_433DB4和它的下一条指令下断点,观察其参数和返回值:

QQ20260923-112343.png

QQ20260923-112845.png

X0存放第一个参数,可以看到是指向json指针的指针,X2未知,X3也是指针,最终指向“did”字符串;返回值是0xFFFFFFF7,所以进一步,进入sub_433DB4查看具体是哪段逻辑返回了这个返回值:

QQ20260923-113148.png

三条支路全部返回了0XFFFFFFF7,这意味着它们会返回相同的错误码。面对这种情况,选择单步跟踪进入sub_433DB4,发现第一个if就已经跳转到ret准备退出了(在AARCH64汇编里,ret等价于B x30),返回值为0,这种情况就继续沿着sub_433BBC函数追踪,,看它哪里返回了0。

评论