Assembly 为什么x86“U 64汇编到execve”/bin/bash“;断层作用?
我一直在重新学习和编写一些汇编代码,这对于初学者来说是非常基本的东西。我正在x86_64上运行Ubuntu,但我下面的教程是在32位x86上完成的 我在下面介绍了一个简短的汇编程序,它可以很好地进行汇编和链接,但在运行时会出错。我打赌我的错误是关于32位和64位指令之间的行和内存使用的一些混淆/混乱。例如,我在所有Assembly 为什么x86“U 64汇编到execve”/bin/bash“;断层作用?,assembly,x86,x86-64,disassembly,Assembly,X86,X86 64,Disassembly,我一直在重新学习和编写一些汇编代码,这对于初学者来说是非常基本的东西。我正在x86_64上运行Ubuntu,但我下面的教程是在32位x86上完成的 我在下面介绍了一个简短的汇编程序,它可以很好地进行汇编和链接,但在运行时会出错。我打赌我的错误是关于32位和64位指令之间的行和内存使用的一些混淆/混乱。例如,我在所有r**寄存器上使用movq指令(我收集的32位寄存器的x86_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
提前谢谢
%rsi
,%rdi
,%rdx
中。看.int 0
太短,在所有三个位置都应为.quad 0
%rsi
,%rdi
,%rdx
中。看.int 0
太短,在所有三个位置都应为.quad 0
我觉得int太短了,所以我盲目地尝试了“long”——我的搜索结果都没有给出使用的建议。quad,谢谢!另外,您对调用约定的引用也起到了作用-非常感谢。我实际上没有记住
.quad
指令的名称(是.qword
还是什么?)gcc-S
在这种情况下很有帮助。我认为int太短了,所以我盲目地尝试了“long”-我的搜索都没有给出使用建议。quad,谢谢!另外,您对调用约定的引用也起到了作用-非常感谢。我实际上没有记住.quad
指令的名称(是.qword
还是什么?)<代码>gcc-S在这种情况下会有所帮助。