【问题标题】:How the OS handles python and subprocesses of a python script...?操作系统如何处理 python 和 python 脚本的子进程......?
【发布时间】:2015-07-10 20:43:30
【问题描述】:

我的问题有些独特。我目前正在为我的计算机取证课做一个项目。该项目旨在向调查人员隐藏磁盘数据。实现这一点的方法是将“干净”文件的字节写入“坏”文件。一旦被覆盖,“坏”文件就会被删除。

这个概念听起来很简单,但我和我的搭档观察到的却很有趣。如果我们在 python 脚本中打开一个文件,我们可以轻松地覆盖磁盘上与该文件关联的内存(使用 dd 验证)。我们还可以从脚本内部轻松删除文件。但是,写入然后删除实际上不会发生写入,只会删除文件。

从操作系统优化的角度来看,这是有道理的。从那时起,我们认为如果将写入和删除分成两个单独的脚本,并由第三人控制,它可能会起作用。但是,似乎即使我们将脚本作为另一个脚本的子进程运行,也会发生同样的事情。我们尝试在删除过程中使用 bash 脚本而不是纯 python,但仍然没有任何问题。

这个项目本来应该是一堆像这样的小反取证工具,但由于这个问题,这个特殊的工具引起了我们的全部关注。有没有人知道为什么会发生这种情况以及我们可以做些什么来继续前进?

我们知道这可以在 C 等语言中实现,但我们希望使用 python 来解决这个问题,因为它存在有趣的约束。

---编辑--- 这是来自我们控制器的 sn-p,它使用相关参数调用“ghost.py”。

ghost.py 将编辑后的文件名/路径打印到标准输出。

相关代码如下:

proc = subprocess.Popen(['python', 'ghost.py', '-c', 'good.txt', '-d','/mnt/evil.txt'], stdout=subprocess.PIPE,)
files = proc.communicate()

for i in files:
    if i != None and i != "\n":
        os.system("./del.sh " + i)

【问题讨论】:

  • 在写入后尝试 file_handle.flush() 或只是 file_handle.close() 这也应该将文件刷新到磁盘
  • 我们目前正在使用f.close(),但没有成功。但是,我会去试一试。
  • 你是如何从父级启动子级的? (特别是,您是否继承了文件描述符,就像您对os.system 所做的那样,这是 Python 2.7 和 3.1 中subprocess 的默认值,但在 3.2+ 中不是;您是否正在创建一个新会话;等等)?这可能会影响是否可以进行操作系统优化……
  • 另外,您是否考虑过使用无缓冲的file/io.* 对象,直接访问os.open/os.write,或者使用O_DIRECTO_SYNC? (如果你做了所有这些,它会自动包含f.flush() 的效果,当然……)我不知道其中哪些会影响你所看到的,但我认为学习这个问题的答案可能对你有帮助……
  • 我们已尝试同时使用os.systemsubprocess,还确保在写入脚本的末尾包含sys.exit() 以确保该过程完成。

标签: python linux operating-system subprocess sh


【解决方案1】:

使用子流程不会改变您设计中任何有趣的方面,所以不要使用它们。你可能需要os.fsync()。试试这个模式:

myfile.write('all of my good data')
myfile.flush()
os.fsync(myfile.fileno())
myfile.close()
os.remove(myfile)

参考:https://docs.python.org/2/library/os.html#os.fsync

【讨论】:

    猜你喜欢
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2019-02-17
    • 2017-04-09
    • 2011-07-28
    • 2017-10-30
    相关资源
    最近更新 更多