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

C 内存中的代码在哪个方向执行?,c,stack,shellcode,C,Stack,Shellcode,假设将外壳代码注入到进程的内存中,外壳代码将以哪种方式执行?假设较高的内存地址位于堆栈底部,较低的内存地址位于堆栈顶部,外壳代码是从外壳代码的最低内存地址运行到外壳代码的最高内存地址,还是反过来运行?您关心堆栈指针的移动方向。堆栈指针在开始时指向内存块(进程所在)的末尾,每当按下新值时,堆栈指针就会递减(每当弹出时,堆栈指针就会递增)。您关心堆栈指针的移动方向。堆栈指针在开始时指向内存块(进程所在)的末尾,每当推送新值时,堆栈指针就会递减(每当弹出新值时,堆栈指针就会递增)。程序计数器(又称指令

假设将外壳代码注入到进程的内存中,外壳代码将以哪种方式执行?假设较高的内存地址位于堆栈底部,较低的内存地址位于堆栈顶部,外壳代码是从外壳代码的最低内存地址运行到外壳代码的最高内存地址,还是反过来运行?

您关心堆栈指针的移动方向。堆栈指针在开始时指向内存块(进程所在)的末尾,每当按下新值时,堆栈指针就会递减(每当弹出时,堆栈指针就会递增)。

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

程序计数器(又称指令指针)通常从较低的内存地址移动到较高的内存地址(当然,分支和函数调用/返回除外).

程序计数器(又称指令指针)通常从较低的内存地址移动到较高的内存地址(当然,分支和函数调用/返回除外)。

除了分支之外,对于x86系列的CPU,IP只能从较低的数字移动到较高的数字

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


堆栈从较高的地址增长到较低的地址。(这可能源于堆栈和堆内存共享同一RAM区域的历史。)然而,这并不意味着堆栈上存储的数据顺序相反-只是新分配的堆栈空间的地址比以前分配的低。

对于x86系列的CPU,除了分支,IP只能从较低的数字变为较高的数字

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


堆栈从较高的地址增长到较低的地址。(这可能源于堆栈和堆内存共享同一RAM区域的历史。)但是,这并不意味着堆栈上存储的数据顺序相反-只是新分配的堆栈空间的地址比以前分配的要低。

对不起,我无法理解我的外壳代码将朝哪个方向执行。请您详细说明/解释您的答案:)对不起,我无法理解我的外壳代码将在哪个方向执行。请您详细说明/解释您的答案:)程序计数器(又称指令指针)通常从较低的内存地址移动到较高的内存地址(当然分支除外)。这是一个错误。顺便说一句,Sander,你能改变eip移动的方向来改变DF标志吗?DF标志仅在复制数据时相关,而不是在向前移动程序计数器时。程序计数器(也称为指令指针)通常从较低的内存地址移动到较高的内存地址(当然分支除外)。这是一个错误。顺便说一句,Sander,你能改变eip移动的方向来改变DF标志吗?DF标志仅在复制数据时才相关,而不是在向前移动程序计数器时。IP不是真正直接公开的,但RIP相对寻址是相对于指令的结尾。在执行一条指令的过程中,最好说IP=这条指令的结束,下一条指令的开始。事实上,原来的8086没有任何推送指令开始地址的异常,因此CPU可能甚至没有保存该地址。(
#DE
故障地址为
div
idiv
指令末尾时发生的故障。请参见上的此答案)IP实际上没有直接公开,但RIP相对寻址是相对于指令末尾的。在执行一条指令的过程中,最好说IP=这条指令的结束,下一条指令的开始。事实上,原来的8086没有任何推送指令开始地址的异常,因此CPU可能甚至没有保存该地址。(
#DE
故障地址为
div
idiv
指令末尾时发生的故障。请参阅上的此答案)