【问题标题】:launch asm compiled binary file with python and capture output [duplicate]用python启动asm编译的二进制文件并捕获输出[重复]
【发布时间】:2019-11-18 15:21:55
【问题描述】:

我编写了一个简单的 asm 二进制文件,它获取用户的 arg,然后使用 C func printf 将其打印在屏幕上。

所以代码编译使用:

nasm -f elf64 ...
gcc -m64 -no-pie ....

该程序运行良好。我想将它与 python 一起使用,这样做,我可以使用 subprocess.Popen(cmd) 启动它(这也很好用)

当我想捕获我的 asm 编译程序的输出以便用 python 解析它时,输出总是空的......

我试过了:

subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE)
subprocess.call(...)
subprocess.run(...)
subprocess.check_output(...)
os.system(...)
os.popen(...)

无论如何,我认为我测试了所有方法......我真的不明白为什么程序在我的 python 脚本上运行良好,除非我尝试捕获输出。

如果有人有想法......,请告诉我。

asm代码是:

; nasm -f elf64 -o test.o test.asm
; gcc -m elf64 test.o -o test

extern printf

section .text
global main
main:
    mov rdi, fmt
    mov rsi, s_val
    xor rax, rax
    call printf WRT ..plt

    ; exit
    xor rdi, rdi,
    mov rax, 0x3c
    syscall


section .data
    s_val db 'hello world', 0
    fmt db '%s',0x0a, 0

python代码是:

#!/usr/bin/python3

import subprocess
from subprocess import Popen

p = Popen(['/home/test'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

r = p.communicate()

print(r)

谢谢

【问题讨论】:

  • 你应该展示你的代码。确保它实际上是在写信给stdoutstderr。许多人误写了stdin,这恰好适用于终端。
  • 使用edit link under your post 将新信息添加到您的问题中。

标签: python assembly subprocess


【解决方案1】:

这是一个经典:您使用 libc 中的 stdio 函数,然后使用原始退出系统调用终止您的程序,从不给它机会在退出时刷新输出。

通过使用exit 函数而不是原始退出系统调用退出程序来解决此问题:

call exit wrt ..plt

或者,只需从main 返回,让 C 运行时启动代码为您退出程序。

【讨论】:

  • 完美!它有效!
  • @ginko 确保将答案标记为已接受,以表明您的问题已得到解决,无需进一步帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多