【问题标题】:NASM .bss variable error "Access violation writing location 0x000000000000000C."NASM .bss 变量错误\“访问冲突写入位置 0x000000000000000C。\”
【发布时间】:2022-09-25 03:16:02
【问题描述】:

我是组装和 NASM 的新手。我试图在 .bss 部分定义一个变量并使用它,但我无法让它运行。它给了我这个错误:

\"访问冲突写入位置 0x000000000000000C\"

这是我的代码:

section .bss
    var: resb 64
    
section .text
    global _start
    
_start:
    [BITS 64]
    mov qword [var],10

我尝试了各种类似mov rax, 10mov [var], rax 之类的东西,但我无法让它运行。

  • 为什么你有一个bits 64 指令在那里?这通常不需要,并且表明您正在做一些非常错误的事情。请展示您如何组装和链接您的代码。
  • 没有它就行不通我正试图将它作为 shellcode 运行。 ./nasm -f bin -O3 -o new_3.bin new_3.asm
  • 如果没有该指令它不起作用,那么你做错了什么。请发布您键入的确切命令以组装和链接您的代码。
  • ./nasm -f bin -O3 -o new_3.bin new_3.asm
  • 你如何运行这段代码?

标签: assembly x86-64 nasm shellcode


【解决方案1】:

你正在尝试做的事情是行不通的。

这是因为在编写 shell 代码时,除了文本部分之外没有其他部分。无法定义静态变量并读/写它们。您还遇到了 shell 代码必须与位置无关的问题,但 nasm 默认为绝对寻址模式

[var]

要解决此问题,您需要编写

[rel var]

选择 rip-relative 寻址模式或通过发出默认选择这样的寻址模式

default rel

尽管如此,在运行时不会有 bss 部分,因此写入其中的变量将不起作用。相反,您可以例如将变量放在堆栈上,如下所示:

sub rsp, 8
mov qword [rsp], 10

【讨论】:

  • 太感谢了。我已经尝试过类似我尝试过 [rbp-8] 的方法,例如它可以正常工作,但它不稳定似乎堆栈可能会在稍后在程序中更改它的值
  • @jeffrey 除非您已将 rbp 设置为指向一个合理的位置,否则它将只有一个未知值。您不能期望该值指向可供您使用的内存。
  • -b 是一个 ndisasm 选项,而不是 nasm。至少我最近的 NASM 版本无法识别它。这是一种罕见的情况,在源代码中使用 bits 指令实际上是正确的方法。
  • @ecm 有趣!好像我记错了这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2015-08-15
  • 2020-09-04
相关资源
最近更新 更多