尝试在 strcmp 指令中识别字符串

逆向工程 拆卸 二元分析 固件 雷达2 二进制
2021-06-11 12:22:53

在调试和分析固件时,我遇到了一堆 cgi 文件,这些文件都符号链接到一个中央 cgi 文件。main 函数所做的第一件事是运行一系列字符串比较来确定应该运行哪个 cgi 文件的函数。

问题是我现在试图将函数映射到它们各自的 cgi 名称,但我对二进制调试相对较新,无法确定如何识别哪些值代表硬编码到内存中的字符串,与输入进行比较。我正在使用 Radare2,下面可以看到代码示例和结构截图。

任何意见,将不胜感激!

0x000099a4   08001be5    ldr r0, [fp - local_8h]   ; const char * s1
0x000099a8   b81709e3    movw r1, 0x97b8
0x000099ac   021040e3    movt r1, 2                ; const char * s2
0x000099b0   5affffeb     bl sym.imp.strcmp        ;[3]; int strcmp(const char *s1, const char *s2)
0x000099b4   0030a0e1    mov r3, r0
0x000099b8   000053e3    cmp r3, 0
0x000099bc   0500001a    bne 0x99d8                ;[4]
0x000099c0   10001be5    ldr r0, [fp - local_10h]
0x000099c4   14101be5    ldr r1, [fp - local_14h]
0x000099c8   18201be5    ldr r2, [fp - local_18h]
0x000099cc   1f4e00eb    bl sub.setuid_250         ;[5]
0x000099d0   0c000be5    str r0, [fp - local_ch]

结构

1个回答

您需要阅读 ARM 指令参考。movt“移动顶部”指令,它将寄存器的前 16 位设置为指定值,而不会更改低 16 位。

换句话说,序列:

movw r1, 0x97b8
movt r1, 2    

相当于:

r1 = 0x97b8
r1 |= (2<<16);

结果是 r1= 0x297b8,以便检查要与之比较的字符串的地址。