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

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

这个x1或者说v7,是一个指针变量,但是该指针指向的地址所保存的东西却有些奇怪,不是立即数,指针,或者字符串,而是0x3200000001这样的写法,如果写成字节形式,那就是:
| 地址 | 字节 | ||
|---|---|---|---|
| 0x1000 | 01 | 低地址 | |
| 0x1001 | 00 | ||
| 0x1002 | 00 | ||
| 0x1003 | 00 | ||
| 0x1004 | 32 | ||
| 0x1005 | 00 | ||
| 0x1006 | 00 | ||
| 0x1007 | 00 | 高地址 |
这看起来非常像一种结构体或者是帧头的有序结构。
先在几个关键点上分别下断点,确定它具体是走了哪个return离开本函数的:


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

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





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