手动去除间接跳转--Binary Ninja
题目 ez_re (N1 Junior 2025 Reverse)
0x01
将文件直接用Binary Ninja
打开之后会发现有很多分析不出来的br跳转
,需要修一修
0x02
找一个函数my_strlen
,可以看到mov w11, #0 mov w12, #0x1
初始化寄存器的值,下面的cmp w10, #0 csel w10, w11, w12, ne {0x0} {0x1}
是关键,先将w10的值跟0x0比较,如果不等于0,则将w10的值设置为w11,否则设置为w12,这一步就导致了后面两种不同的情况的跳转,也就是我们需要手修的地方
看注释就行
note:
1.[5230]和[5238]在{data_5230}里面可以找到
2.w11存的值需要往上找对应的sp,先看到w8,然后再往上看需要找[x0],因为在ARM架构中前 8 个参数通过寄存器 x0-x7 传递,即去找传入函数的第一个参数
这里用伪C看就能很清晰地看到&var_28
传入my_strlen
,所以w8=[x0]=0xd0deba7d
3.计算出来可以知道x8=23C8 or 23D8,而23C8就是br x8指令下面一条地址,也正是以为这个跳转有两种情况所以bn分析不出来,需要手动修改
0x03
修改br x8
,右键->Patch
->Assemble
,这里需要追前面比较的地方csel
后面是ne
->not equel,所以改成bne
,这里跳转的地址是相对地址,要用需要跳转的地址减去现在的地址即用23D8-23C4得到0x14,最终bne 0x14
,最后Reanalyze
一下就修好了
其他需要修的跳转基本上都是这个模式,先比较,有两种跳转情况,分析之后再去手修跳转
手动去除间接跳转--Binary Ninja
http://example.com/2025/03/21/fixjump/