纠正我对基本分配内存的理解

逆向工程 部件 linux x64
2021-06-12 19:02:45

这是函数在此处输入图片说明

如果我理解正确:

  • 创建了一个大小为 256 字节的缓冲区(malloc)
  • 在此缓冲区中,前 32 位设置为 0(因为 dword 指定 32 位大小)
  • 接下来的 32 位(32 到 63)被设置为 C8h
  • 接下来的 32 位(64 到 95)为 0。

然后创建另一个内存大小为 3200 的指针。这个新指针的地址写在第127位到127+64=191位之间的第一个缓冲区中。

然后我们返回第一个缓冲区的地址。

我对吗?

非常感谢你!!!

PS:附加问题:为什么'rax+1'要理解为'rax+8bits'而不是rax+1bit?

1个回答

如果我理解正确:

在这个缓冲区中创建了一个大小为 256 字节的缓冲区(malloc),前 32 位设置为 0(因为 dword 指定 32 位大小)接下来的 32 位(32 到 63)设置为 C8h,接下来的 32 位(64到 95) 到 0。

是的!

这个新指针的地址写入第 127 位之间的第一个缓冲区

那么它将是第 128 位。qword atrax+0x10是第一个malloc.


但这些并不是严格的位偏移。您可以从内存开始计算多少位,但我会质疑为什么这很重要。

PS:附加问题:为什么'rax+1'要理解为'rax+8bits'而不是rax+1bit?

rax 是一个 64 位寄存器,因此您可以使用它来表示 2^64 个值。

如果rax0x12345678并且我添加了1,会发生什么?0x12345679无论您想要表示多少位,它都会变成(过度简化,但我希望这能说明问题)。

例如: mov dword ptr [rax+4], 0xC8

参考:https : //www.felixcloutier.com/x86/MOV.html

从上面的参考,这是一个mov m32, imm32意思是通过这个指针将一个 32 位常量复制到 32 位 DWORD 中 [rax+4]

所以因为[rax+4]代表一个指向字节可寻址内存的指针,所以+4代表4个字节。

这只是因为m32操作数 tomov与字节地址有关。还有其他 x86 指令可以操作位,但不是这个。