我试图弄清楚“上帝对象”的结构。
我找到了它被初始化的地方,但我以前从未见过这样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 的了解相当有限。任何关于这里可能发生的事情的见解将不胜感激。