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

sub_433DB4函数代码量很短,但内部逻辑量感觉很多:

QQ20260924-131600.png

可以看出v7是一个关键变量,它被x19寄存器保存,由sub_433DB4的第二个参数进行传递,也就是X1:

QQ20260924-132243.png

这个x1或者说v7,是一个指针变量,但是该指针指向的地址所保存的东西却有些奇怪,不是立即数,指针,或者字符串,而是0x3200000001这样的写法,如果写成字节形式,那就是:

地址字节
0x1000 01低地址
0x1001 00
0x1002 00
0x1003 00
0x1004 32
0x1005 00
0x1006 00
0x1007 00高地址

这看起来非常像一种结构体或者是帧头的有序结构。

先在几个关键点上分别下断点,确定它具体是走了哪个return离开本函数的:

QQ20260924-151007.png

QQ20260924-152220.png

(**这里我一开始为了省事,想在每个ret上下断点,但是很快发现它们都复用了同一段gadget,return v7是mov
x0,x19,然后恢复栈帧,最后ret;而return 0是在这段gadget之前补了一个mov x19,#0并且跳转。**)
ret前最后一次命中的断点是0x433cd8,对应while循环最后的return v7:

QQ20260924-152326.png

绕过它的方法很简单,只需要在ret前用dbg修改内存,令x0不为0即可,但这里显然不能敷衍了事,重新进入该循环,观察x19寄存器的变化:

QQ20260924-152851.png

QQ20260924-152906.png

QQ20260924-152947.png

QQ20260924-153057.png

QQ20260924-153337.png

共计循环了五次,指针每次递增0x20,很显然是在进行遍历,同时每次该指针指向的地址存储的字节都符合之前的特殊格式,打印内存:

QQ20260924-153720.png

评论