8

我正在尝试让 chroot 在我的 mac 书上工作。我设置了 jail 目录以包含 /bin/sh 和 /bin/bash 的所有要求(递归称为 /usr/bin/otool)

# ls /var/chroot/*/*
/var/chroot/bin/bash    /var/chroot/bin/sh

/var/chroot/usr/lib:
libDiagnosticMessagesClient.dylib       libauto.dylib
libc++abi.dylib                         libobjc.A.dylib
libSystem.B.dylib                       libc++.1.dylib
libncurses.5.4.dylib                    system

当我尝试在 /var/chroot 上使用 chroot 时,它一直说找不到 /bin/bash

# chroot /var/chroot/
chroot: /bin/sh: No such file or directory
$ sudo chroot /var/chroot/
chroot: /bin/bash: No such file or directory

知道是什么导致 chroot 无法在我的 Mac 上工作吗?

OSX 版本 10.8.4

编辑:在 CentOS 上,当我运行 ldd /bin/bash 时,我得到了所有需要的库。如果我不将它们全部复制,它会显示 /bin/bash: No such file or directory。所以我认为这意味着在 mac 上我缺少库;只是不确定是哪个。

4

2 回答 2

8

您需要复制/usr/lib/dyld到您的 chroot 监狱以获取动态链接器。如果不存在,则尝试在 chroot 监狱中执行任何操作都将失败,除了Killed: 9. 一旦您被/usr/lib/dyld复制过来,那么如果您缺少任何其他库,您将收到错误消息,例如:

dyld: Library not loaded: /usr/lib/libncurses.5.4.dylib
  Referenced from: /bin/bash
  Reason: image not found

从您的文件列表中,我看到您没有/usr/lib/dyld,所以我认为这很可能是您的问题。我不确定您为什么要解决此问题No such file or directory而不是Killed: 9解决此问题;这可能是操作系统版本的差异——我在 Mac OS X 10.10.5 上进行测试,您正在(或曾经)在 Mac OS X 10.8.4 上进行测试。

hwatkins 的回答当然有效,因为它复制了/usr/lib/dyld所有必需的 dylib 以运行/bin/bash到监狱。但是,在设置监狱时,我更喜欢只复制最低限度的内容以使其正常工作。复制 dyld 和 bash 后,您可以按照错误消息获取所需的所有其他库的路径。(有点费力,但这是保证的最低限度。)

递归调用的方法otool -L也适用于 *.dylib 文件,但它不会告诉你/usr/lib/dyld. 这是因为-L打印使用的共享库,但/usr/lib/dyld不完全是共享库。如果您otool -l在可执行库上运行,您将看到-L输出与加载命令LC_LOAD_DYLIB(以及一些变体,例如)匹配,而对inLC_REEXPORT_DYLIB的引用不是由.dyldLC_LOAD_DYLINKER-L

于 2015-12-06T10:07:02.313 回答
7

当你说你做了递归时otool -L,你是什么意思?完成这项工作需要很多共享库,例如:

otool -L /bin/bash
/bin/bash:
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)

然后你必须otool -L在那些(然后otool -L在那些)上运行:

otool -L /usr/lib/libSystem.B.dylib
/usr/lib/libSystem.B.dylib:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
    /usr/lib/system/libcache.dylib (compatibility version 1.0.0, current version 62.0.0)
    /usr/lib/system/libcommonCrypto.dylib (compatibility version 1.0.0, current version 60049.0.0)
    /usr/lib/system/libcompiler_rt.dylib (compatibility version 1.0.0, current version 35.0.0)
    /usr/lib/system/libcopyfile.dylib (compatibility version 1.0.0, current version 103.0.0)
    /usr/lib/system/libcorecrypto.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/system/libdispatch.dylib (compatibility version 1.0.0, current version 339.1.9)
    /usr/lib/system/libdyld.dylib (compatibility version 1.0.0, current version 239.3.0)
    /usr/lib/system/libkeymgr.dylib (compatibility version 1.0.0, current version 28.0.0)
    /usr/lib/system/liblaunch.dylib (compatibility version 1.0.0, current version 842.1.4)
    /usr/lib/system/libmacho.dylib (compatibility version 1.0.0, current version 845.0.0)
    /usr/lib/system/libquarantine.dylib (compatibility version 1.0.0, current version 71.0.0)
    /usr/lib/system/libremovefile.dylib (compatibility version 1.0.0, current version 33.0.0)
    /usr/lib/system/libsystem_asl.dylib (compatibility version 1.0.0, current version 217.1.4)
    /usr/lib/system/libsystem_blocks.dylib (compatibility version 1.0.0, current version 63.0.0)
    /usr/lib/system/libsystem_c.dylib (compatibility version 1.0.0, current version 997.1.1)
    /usr/lib/system/libsystem_configuration.dylib (compatibility version 1.0.0, current version 596.12.0)
    /usr/lib/system/libsystem_dnssd.dylib (compatibility version 1.0.0, current version 522.1.11)
    /usr/lib/system/libsystem_info.dylib (compatibility version 1.0.0, current version 449.1.3)
    /usr/lib/system/libsystem_kernel.dylib (compatibility version 1.0.0, current version 2422.1.72)
    /usr/lib/system/libsystem_m.dylib (compatibility version 1.0.0, current version 3047.16.0)
    /usr/lib/system/libsystem_malloc.dylib (compatibility version 1.0.0, current version 23.1.10)
    /usr/lib/system/libsystem_network.dylib (compatibility version 1.0.0, current version 241.3.0)
    /usr/lib/system/libsystem_notify.dylib (compatibility version 1.0.0, current version 121.0.0)
    /usr/lib/system/libsystem_platform.dylib (compatibility version 1.0.0, current version 24.1.4)
    /usr/lib/system/libsystem_pthread.dylib (compatibility version 1.0.0, current version 53.1.4)
    /usr/lib/system/libsystem_sandbox.dylib (compatibility version 1.0.0, current version 278.10.0)
    /usr/lib/system/libsystem_stats.dylib (compatibility version 1.0.0, current version 93.1.26)
    /usr/lib/system/libunc.dylib (compatibility version 1.0.0, current version 28.0.0)
    /usr/lib/system/libunwind.dylib (compatibility version 1.0.0, current version 35.3.0)
    /usr/lib/system/libxpc.dylib (compatibility version 1.0.0, current version 300.1.17)

我做了一个快速测试:

mkdir -p /Users/chroot/bin /Users/chroot/usr/lib/system
cp /bin/bash /Users/chroot/bin
cp /usr/lib/* /Users/chroot/usr/lib
cp /usr/lib/system/* /Users/chroot/usr/lib/system

chroot /Users/chroot /bin/bash

这行得通,所以我假设您缺少所需的共享库。您可能可以编写一个脚本来完全执行递归otool -L并获得您需要的确切共享库,但是进行批量复制可能更容易。

于 2013-11-22T17:01:21.027 回答