当前位置: 首页 > 面试题库 >

Linux 64位中的进程命令行

孟浩然
2023-03-14
问题内容

我从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