用python启动asm编译的二进制文件并捕获输出

2024-05-29 04:58:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我编写了一个简单的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)

泰铢


Tags: 代码testcmdstdoutraxgccsubprocessasm
1条回答
网友
1楼 · 发布于 2024-05-29 04:58:38

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

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

call exit wrt ..plt

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

相关问题 更多 >

    热门问题