我从Linux 64位汇编程序访问进程命令行时遇到问题。为了用最少的代码重现该代码,我制作了一个32位程序,该程序打印程序名的前5个字符:
.section .text
.globl _开始
_开始:
move%esp,%ebp
movl $ 4,%eax#写
movl $ 1,%ebx#stdout
movl 4(%ebp),%ecx#程序名称地址(argv [0])
movl $ 5,%edx#硬编码长度
整数$ 0x80
movl $ 1,%eax
movl $ 0,%ebx
整数$ 0x80
该程序正在运行。当我将其转换为64位并在Linux 64上运行时,它不会显示任何内容:
.section .text
.globl _开始
_开始:
movq%rsp,%rbp
movq $ 4,%rax
movq $ 1,%rbx
movq 8(%rbp),%rcx#程序名称地址
movq $ 5,%rdx
整数$ 0x80
movq $ 1,%rax
movq $ 0,%rbx
整数$ 0x80
我的错误在哪里?
您正在将正确的地址加载到中%rcx
。
int 0x80
然后调用32位syscall接口。这会将地址截断为32位,这使它不正确。(如果您使用调试器并在第一个调试器之后设置一个断点int 0x80
,则会看到它返回-14 in %eax
,即-EFAULT
。)
第二个syscall exit
可以正常工作,因为在这种情况下,截断为32位不会造成任何损害。
如果要将64位地址传递给系统调用,则必须使用64位syscall接口:
syscall
而不是int 0x80
;这是您的代码的有效版本:
.section .text
.globl _start
_start:
movq %rsp, %rbp
movq $1, %rax
movq $1, %rdi
movq 8(%rbp), %rsi # program name address ?
movq $5, %rdx
syscall
movq $60, %rax
movq $0, %rdi
syscall
问题内容: 我有一个系统,需要从几个不同的进程接收输入。最简单的只是命令行,用户可以在其中手动输入数据。这些数据将添加到并由主流程稍后处理,但我还没有走那么远;在进程内部调用似乎不起作用。我抽出了代码的精髓,下面是一个示例: 这个简单的代码抛出了这一点: 如何在Python的进程中获取命令行输入? 问题答案: 当您在Python中生成线程时,它将关闭stdin。您不能使用子流程来收集标准输入。使用
问题内容: 我正在使用Dockerfile创建Docker映像。我想在启动Docker容器时执行一些脚本。目前,我有一个Shell脚本来执行所有必要的过程 CMD [“ sh”,“ start.sh”] 我想用在后台示例中运行的进程执行shell命令 CMD [“ sh”,“-c”,“ mongod –dbpath / test&”] 问题答案: 除了对您的问题的评论已经指出有关Docker最佳实
我正在使用DockerFile创建一个docker图像。我想在启动docker容器的同时执行一些脚本。目前我有一个shell脚本来执行所有必要的进程 CMD[“sh”,“start.sh”]
问题内容: 我使用以下命令在Centos中运行服务器可执行文件。现在我需要取消这个过程。但是我尝试使用命令来获取,但是无法获取该过程。现在如何杀死现在? 问题答案: 应该返回其中包含的所有过程。否则,服务器可能已经停止。 您应该能够确定PID(并将其存储在文件中),如下所示:
问题内容: 如果我在bash中运行,结果将是两个命令都运行。但是,如果我使用子进程,则将运行第一个命令,打印出该行其余部分的全部内容。下面的代码回显而不是,我如何才能运行两个命令? 问题答案: 您必须在子进程中使用shell = True,而不能使用shlex.split: 返回:
kill 从字面来看,就是用来杀死进程的命令,但事实上,这个或多或少带有一定的误导性。从本质上讲,kill 命令只是用来向进程发送一个信号,至于这个信号是什么,是用户指定的。 也就是说,kill 命令的执行原理是这样的,kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。 kill 命令的基本格式如下: [roo