【问题标题】:SIGSEGV on simple move register to memory in NASMSIGSEGV 上的简单移动寄存器到 NASM 中的内存
【发布时间】:2021-06-05 16:25:18
【问题描述】:

我必须在这里遗漏一些非常基本的东西。搜索 SO 但找不到这个特定问题的答案。这是我的 NASM 代码:

%include "io64.inc"

section .text
    myvar db "This is not working", 0
global CMAIN
CMAIN:
    mov rbp, rsp; for correct debugging
    ;write your code here
    xor rax, rax
    mov [myvar], rax
    ret

它在带有 SIGSEGV 的 move [myvar], rax 行上崩溃。我只是想在那个地址存储一些零。

谢谢!

PS:在 Windows 10 64 位上使用 SASM 构建/运行/调试并勾选 64 位选项(否则为默认设置)。

【问题讨论】:

    标签: memory segmentation-fault nasm cpu-registers mov


    【解决方案1】:
    section .text
       myvar db "This is not working", 0
    

    Section .text 是一个没有写权限的可执行部分。这样做是为了防止某些类型的漏洞。您应该将 myvar 放入可写部分,例如.data(如果变量应该在程序执行的整个过程中都存在),将变量放在堆栈上(如果它不应该超过创建它的函数),或者将 .text 更改为可写(不推荐用于安全原因,但possible)。

    【讨论】:

    • 是的,就是这样,谢谢鲁斯兰!我注意到的一件事(我花了一段时间才弄清楚)是.data 部分必须放在最后。如果我在.text 部分之后和实际代码之前有.data 部分,它仍然会崩溃。如果我将.data 部分移动到程序的末尾,它就可以工作。我确信有一个解释。不管怎样,非常感谢!
    • @Gec:您可以先输入section .data,然后输入您想要的数据,然后再更改为section .text,这样应该可以了。实际代码之前的最后一个section 指令需要激活文本部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    相关资源
    最近更新 更多