我有一个使用raw_input
读取的python脚本,然后使用system("sh")
打开一个shell,例如
r_input = raw_input('Enter the key\n')
system("sh")
我需要为这个脚本提供一些二进制数据,我使用print或sys.stdout.write
,例如。
python -c "import sys; sys.stdout.write('\x02\x03\x04')" | python ./input_parse.py
问题在于,尽管输入是完全读取的,但是shell会立即退出,就好像它从stdin
中获得了一些遗留物。当我从键盘输入脚本时,它可以工作,但是我不能把二进制数据放在那里,它被解释为字符串......
我试过subprocess
,就像这样(但差别不大):
python -c "import subprocess; process = subprocess.Popen(['python', 'input_parse.py], shell=False, stdin=subprocess.PIPE);process.stdin.write('hi')" | python ./py_deobf_input_parse.py
我怎样才能让它发挥作用?
更新:我找到了一个解决方案,可能并不理想,但有效。基本上我使用相同的subprocess
模型,但必须将\n
添加到输入的末尾。然后我做了另一个process.stdin.write
将命令传递给打开的shell。我不得不在它们之间加入睡眠,否则它会立即退出。如果有人找到更好的答案,我仍然会给予肯定。
python -c "import subprocess; import time; process = subprocess.Popen(['./py_input_parse'], stdin=subprocess.PIPE); process.stdin.write('\x02\x02\x02\x02\n'); process.stdin.flush(); time.sleep(2); process.stdin.write('cat ./flag.txt \n');
答案 0 :(得分:1)
你期待什么?你input_parse.py
的标准输出是写作脚本的标准输出。一旦读完所有二进制数据,stdin就会完成。因此,之后调用shell会检测到已关闭的stdin并终止。