【问题标题】:Program which checks the output of another program检查另一个程序的输出的程序
【发布时间】:2013-03-07 05:10:13
【问题描述】:

我正在组织一场编程比赛。我需要创建一个程序来逐个字符地检查另一个程序(参与者的可执行文件)的输出。要求是:

  • 程序必须是platform independent
  • 参与者不能使用输入和正确的输出。参与者所做的只是将他的程序名称传递给检查器。检查器告诉答案是否正确,就是这样。
  • 参与者程序的输出不得显示给参与者本人 - 否则他可能会据此计算输入。

对于第二部分,是否可以以某种方式将输入和输出存储在可执行文件本身中?我宁愿不从加密文件中读取..这让事情有点不方便..

程序应该像这样工作:

checker.exe question1.exe

正确答案,恭喜!

请把这个给志愿者看。

我尝试使用标准 C 库中的 popenpclose 函数。

但问题在于,在 Linux 中,它会打开一个 shell,显示参与者程序的输出,根据第三个要求,这不应该发生。

有什么简单的方法可以做到这一点?提前致谢。

编辑

我需要将针对每个问题制作的可执行文件专门交给参与者。

【问题讨论】:

  • 显示您的代码会有所帮助。我认为您不需要在 C 中执行此操作——当我需要制作这样的脚本时,一个简单的 shell 脚本可以正常工作。我不再拥有它了(那是 15 年前的事了)。
  • 用代码编写它,将其存储在数据库中,将其存储在网络服务器上并使用套接字发出请求。尽管最简单的方法是将其存储在代码中,但其中任何一个都应该有效。
  • 一个非常聪明的竞争对手会编写一个程序来清除屏幕并逐字生成如上所示的输出......你怎么知道?
  • 该程序是否将由参与者自己运行?那么就没有办法控制参与者按原样打印输入:) 您应该让用户将他的程序上传到您的服务器,这将运行程序并验证并返回结果 - 如果程序正确或不是。
  • @Hogan 我需要将可执行文件交给参与者。

标签: c linux windows ipc pipe


【解决方案1】:

是的,永远不要将信息存储在 shell 中很容易......只需使用管道。

例如

  $ question | checker

Checker 可以打印它是否有效。这一切都发生在记忆中。


如果您希望用户能够自己执行此操作,只需将此代码放在脚本文件中,设置文件以便用户只能执行和读取 priv。然后将脚本设置为以 su 运行。然后脚本可以进行检查(即运行检查器 - 或进行比较)。如果需要比较,则数据文件可以在脚本外部,并且用户无权访问该文件,则他们无法读取数据。

【讨论】:

  • 我认为这是一个可行的选择。检查器只存储正确输出的哈希值,从其标准输入读取question 的输出(对吗?),然后计算其哈希值并进行比较。对吗?
  • 不管有没有设置suid位,你都不能在没有读取权限的情况下执行脚本,就这么简单。
  • 当然,当我这样做时,我并没有为哈希而烦恼,我只是得到了另一个正确的文件并做了一个comp。由于我设置了正确的权限,没有人可以在不运行脚本的情况下阅读它们
  • 我上面所说的 - 将question 的输出传送到检查器,并验证它的哈希 - 它有任何陷阱吗?如果没有,这对我来说似乎是完美的解决方案。
  • @Bruce - 很好 - 但比需要的稍微复杂一点,恕我直言
【解决方案2】:

一种选择是要求用户使用您提供的公钥加密他们程序的输出:gnupg 可能是一个不错的选择。使用您的私钥解密输出并进行比较。

否则,如果不将程序的输出存储到某个文件(二进制或文本)并且不损害数据的隐私性,就不清楚如何进行比较。

【讨论】:

  • 您可以散列程序的输出并将其与正确输出的散列进行比较。无需解密!
  • @Floris 是的,我不知道为什么我没有考虑散列!
猜你喜欢
  • 2015-08-31
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 2023-03-09
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多