Ghidra 显示指针作为 calloc 的大小参数给出

逆向工程 手臂 吉德拉
2021-07-02 13:49:10

我试图弄清楚“上帝对象”的结构。

我找到了它被初始化的地方,但我以前从未见过这样calloc使用过:

god = (God *)calloc(1,(size_t)&god_size_marker?);
__aeabi_memclr8(god,&god_size_marker?);

God我目前试图找出的结构在哪里,以及god_size_marker?我给指针位置的名称。

奇怪的是,它传递了一个指向的第二个参数的指针calloc如果我有 Ghidra follow god_size_marker?,我会看到:

                     god_size_marker?                                XREF[2]:     create_instance:0005b0ac(*), 
                                                                                  create_instance:0005b0c8(*)  
00700438 7d              db         7Dh

所以地址是0x700438。如果我手动将结构设置为大小0x700438,这似乎解决了我上一个问题中的问题,但这很荒谬。指向该.rodata部分的指针可能具有什么意义这显然也具有结构中某些字段偏移与全局变量地址重合的奇怪结果:

puVar4 = (uint *)&DAT_007003e8;  // These lines are right beside each other. Note the names.
bVar20 = first_counter <= *(uint *)&god->field_0x7003e8;

他们使用指针初始化结构的大小实际上是否合理?对我来说,这表明 Ghidra 误解了某些东西,我需要解决一些问题。我什至不知道从哪里开始仅从这种行为开始。

作为参考,这里是对calloc调用的相关反汇编__aebi_memclr8

    0005b0ac 05 f1 70 01     add.w      r1=>god_size_marker?,r5,#0x70                    = 7Dh
    0005b0b0 93 46           mov        r11,r2
    0005b0b2 00 68           ldr        r0,[r0,#0x0]=>->__stack_chk_guard                = 01dbe014
    0005b0b4 4f f0 01 0a     mov.w      r10,#0x1
    0005b0b8 00 68           ldr        r0,[r0,#0x0]=>__stack_chk_guard                  = ??
    0005b0ba 19 90           str        r0,[sp,#local_3c]
    0005b0bc 01 20           movs       r0,#0x1
    0005b0be f8 f7 2c ec     blx        <EXTERNAL>::calloc                               void * calloc(size_t __nmemb, si...
    0005b0c2 40 f2 38 41     movw       r1,#0x438
    0005b0c6 04 46           mov        r4,god
    0005b0c8 c0 f2 70 01     movt       r1=>god_size_marker?,#0x70                       = 7Dh
    0005b0cc f8 f7 ee eb     blx        <EXTERNAL>::__aeabi_memclr8                      undefined __aeabi_memclr8()

不幸的是,虽然我可以阅读 x86 汇编,但我对 ARM 的了解相当有限。任何关于这里可能发生的事情的见解将不胜感激。

1个回答
0005b0c2 40 f2 38 41     movw       r1,#0x438
0005b0c6 04 46           mov        r4,god
0005b0c8 c0 f2 70 01     movt       r1=>god_size_marker?,#0x70 

movwmovt一起将设置r1到0x700438(0x70 << 16 + 0x438),所以这是被清除量和可能被分配的金额。似乎 Ghidra 用地址表达式替换它只是因为该地址碰巧有一个变量。您可能需要联系 Ghidra 支持人员,以确定是否有办法将其视为数字而不是地址。