【问题标题】:Which direction does code in the memory get executed?内存中的代码执行的方向是什么?
【发布时间】:2023-04-04 08:10:02
【问题描述】:

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

【问题讨论】:

  • 程序计数器(又名指令指针)通常从较低的内存地址移动到较高的内存地址(当然分支除外)。
  • 那是个错误。顺便说一句 Sander,你能改变 eip 移动的方向来改变 DF 标志吗?
  • DF 标志仅在复制数据时相关,而不是在向前移动程序计数器时相关

标签: c stack shellcode


【解决方案1】:

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

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

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

【讨论】:

  • IP 并没有真正直接暴露,但 RIP 相对寻址是相对于指令的 end 而言的。在执行一条指令期间,说 IP = 这条指令的结束,下一条指令的开始是最有意义的。事实上,原来的 8086 没有任何推送指令起始地址的异常,所以 CPU 可能甚至没有保存它。 (#DE 发生故障,故障地址 = dividiv 指令的结尾。请参阅x86 Program Counter abstracted from microarchitecture? 上的此答案)
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 抱歉,我无法理解我的 shellcode 将执行的方向。您能否详细说明/解释您的答案:)
    猜你喜欢
    • 2018-04-08
    • 2019-12-13
    • 1970-01-01
    • 2011-10-10
    • 2017-06-27
    • 2019-03-27
    • 1970-01-01
    • 2011-01-05
    • 2011-03-15
    相关资源
    最近更新 更多