2

我正在尝试编写一个简单的判断程序来编译和执行用户提交的 c 文件。我在 stackoverflow 上找到 了libsandbox和一个问题

我已经安装了 python 模块,并且按照说明我正在尝试运行一个用 C 编写的 hello world 程序

➜  sandbox git:(V_0_3_x) ✗ ./hello                            
Hello World%                                                                   
➜  sandbox git:(V_0_3_x) ✗ python sample2.py hello   
result: RF
cpu: 2ms
mem: 288kB

如您所见,当我在沙箱中运行程序时,我没有得到任何输出。如果有人能告诉我如何正确使用它,那就太好了。

4

2 回答 2

3

示例代码libsandbox禁止对文件操作进行系统调用,例如open(), stat(), close(). 也就是说,您需要 (1)静态链接hello world 程序以避免打开共享库 (ie ) 等文件,或者 (2) 编写允许相关系统调用的自定义沙箱策略。可以在https://github.com/liuyu81/TR-OJA-201209A找到一些自定义沙盒策略的示例。libc.so

免责声明:我是libsandbox.

于 2013-01-14T23:45:51.483 回答
1

RF 结果代码很可能是由于文件操作的意外系统调用(即 SYS_open()、SYS_close()、SYS_stat()、...)。当(1)目标程序实际执行文件操作时,和(或)当(2)它被动态链接并需要在运行时加载 .so 库时,就会发生这种情况。由于你的目标程序不调用文件操作,所以属于后一种情况。

然后,要解决 RF 结果,要么,

静态链接目标程序,避免对共享库的依赖;或者,扩展包装脚本中的策略规则以处理相关的 SYSCALL / SYSRET 事件;

对于静态链接系统调用,我们使用 ex 0,1,2 3-sys_read 1-sys_exit 等的系统调用代码通过链接获取更多详细信息链接以获取系统调用列表的代码:http://docs.cs.up。 ac.za/programming/asm/derick_tut/syscalls.html

我改变这个:

x86_64=set([0,1,5,8,9,10,11,12,16,21,25,63,89,158,219,231])

为了这:

x86_64=set([0,1,2,3,4,5,8,9,10,11,12,16,21,25,63,89,158,219,231,])

在 sample2.py 中,它可以工作。

修改后的 sample2.py 可在我的 github 存储库链接中找到: https ://github.com/palashmaran/libsandbox.git

于 2016-01-23T19:26:11.087 回答