使用python启动asm编译的二进制文件并捕获输出
我编写了一个简单的asm二进制文件,用于获取用户的参数,然后使用C func printf在屏幕上打印它 因此,代码是通过以下方式编译的:使用python启动asm编译的二进制文件并捕获输出,python,assembly,subprocess,Python,Assembly,Subprocess,我编写了一个简单的asm二进制文件,用于获取用户的参数,然后使用C func printf在屏幕上打印它 因此,代码是通过以下方式编译的: nasm -f elf64 ... gcc -m64 -no-pie .... 这个程序运行得很好。我想将它与python一起使用,这样我就可以使用subprocess.Popen(cmd)启动它(这也很有效) BUUUT当我想要捕获asm编译程序的输出以便用python解析它时,输出总是空的 我试过: subprocess.Popen(cmd, stdo
nasm -f elf64 ...
gcc -m64 -no-pie ....
这个程序运行得很好。我想将它与python一起使用,这样我就可以使用subprocess.Popen(cmd)启动它(这也很有效)
BUUUT当我想要捕获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)
thx这是一个经典:您使用libc中的stdio函数,然后使用原始退出系统调用终止您的程序,永远不会给它在退出时刷新输出的机会 通过使用
exit
函数而不是原始退出系统调用退出程序来解决此问题:
call exit wrt ..plt
或者,只需从
main
返回,让C运行时启动代码为您退出程序。您应该显示代码。确保它实际上正在写入stdout
或stderr
。许多人会错误地向stdin写入内容,而stdin恰好适用于终端。请使用添加新信息到您的问题中。太好了!它起作用了@银杏确保将答案标记为已接受,以表明您的问题已解决,无需进一步帮助。