【问题标题】:Why is x86_64 assembly to execve "/bin/bash" segfaulting?为什么 x86_64 程序集执行“/bin/bash”段错误?
【发布时间】:2013-01-10 15:03:04
【问题描述】:

我一直在重新学习和编写一些汇编代码,对于初学者来说是非常基本的东西。我在 x86_64 上运行 Ubuntu,但是我跟随的教程是在 32 位 x86 上完成的。

我在下面包含了一个简短的汇编程序,它可以很好地组装和链接,但是在运行它时会出现段错误。我打赌我的错误是关于 32 位和 64 位指令之间的行和内存使用情况的一些混淆/混淆。例如,我在所有 r** 寄存器上使用 movq 指令(我收集的 32 位寄存器的 x86_64 版本)-但这可能是错误的。

如果有人能够在这里解释问题,我将不胜感激,我觉得如果我能更好地理解原因,它将真的有助于避免将来出现此类问题。

 .data
Bash:
    .asciz "/bin/bash"
Null1:
    .int 0
AddrToBash:
    .int 0
Null2:
    .int 0

.text
.globl _start

_start:
movq $Bash, AddrToBash
movq $59, %rax
movq $Bash, %rbx
movq $AddrToBash, %rcx
movq $Null2, %rdx
syscall 

Exit:
movq $60, %rbx
movq $1, %rax
syscall

提前致谢!

【问题讨论】:

    标签: assembly x86 x86-64 disassembly


    【解决方案1】:
    1. 系统调用参数位于%rsi%rdi%rdx。见What are the calling conventions for UNIX & Linux system calls on x86-64
    2. .int 0 太短,三个地方都应该是.quad 0

    【讨论】:

    • 我认为那里的 int 太短了,所以我盲目地尝试了 'long' - 我的搜索都没有产生使用 .quad 的建议,谢谢!此外,您对调用约定的引用起到了作用 - 非常感谢。
    • 我实际上没能回忆起.quad 指令的名称(是.qword 还是什么?)。 gcc -S 在这种情况下会有所帮助。
    猜你喜欢
    • 2016-08-07
    • 2014-03-03
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 2020-02-05
    • 2017-03-26
    • 1970-01-01
    相关资源
    最近更新 更多