内存中的代码向哪个方向执行?

Which direction does code in the memory get executed?

假设我将shellcode注入到一个进程的内存中,shellcode将以何种方式执行?假设高内存地址在栈底,低内存地址在栈顶,shellcode 运行 是从 shellcode 的最低内存地址到 shellcode 的最高内存地址还是相反?

你关心堆栈指针移动的方向。堆栈指针在开始时指向该内存块(您的进程所在)的末尾,并在推入新值时递减(并在弹出时递增)。

程序计数器(又名指令指针)通常从较低的内存地址移动到较高的内存地址(当然除了分支和函数 calls/returns)。

除了分支,对于来自 x86 系列的 CPUs,IP 只能从低到高。

执行前,IP 位于一条指令的开头。 CPU 在指令被解码之前不知道它有多长。不可能朝另一个方向前进,因为无法确定先前指令的最后一个字节是参数还是指令编码本身的一部分。

堆栈从高地址向低地址增长。 (这可能有历史渊源,因为堆栈和堆内存共享相同的 RAM 区域。)但是,这并不意味着存储在堆栈上的数据是倒序的——只是新分配的堆栈 space 有比之前分配的地址低的地址。