我编写了一个简单的asm二进制文件,获取用户的arg,然后使用C func printf在屏幕上打印它
因此,代码的编译使用:
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)
泰铢
这是一个经典:您使用libc中的stdio函数,然后用一个原始的exit系统调用终止您的程序,从来没有给它在exit时刷新输出的机会
通过使用
exit
函数而不是原始的退出系统调用退出程序来解决此问题:或者,只需从
main
返回即可让C运行时启动代码为您退出程序相关问题 更多 >
编程相关推荐