Copying files between the host and the guest

The s2eget and s2eput tools allow transfering files between the guest virtual machine and the host during symbolic execution even when there is no network available. If you use s2e-env and stock VM images, these two utilities are already included in the guest VM.

s2eget

In order to copy a file from the host to the guest VM, add the following command to the desired location in your bootstrap.sh:

./s2eget <filename>

<filename> specifies the file to copy from the host into the guest. Note that the filename argument to s2eget must be specified relative to the HostFiles plugin base directory (see below).

If <filename> is an executable file that you want to run, you may use the following command:

./s2eget <filename> && chmod +x ./<filename> && ./<filename>

Note

To see a real example of how to use this command, have a look at the bootstrap.sh file generated by s2e-env. This script already contains several invocations of s2eget, which copy the binary to analyze from the host to the guest VM, together with several other support files.

s2eput

To copy a file fileName from the guest to the host, run the following command:

./s2eput fileName

This uploads fileName in the guest to the s2e-last/outfiles directory on the host. This is useful, e.g., if a program that you are analyzing generates a core dump and you want to inspect it on your host.

Note

The upload will fail if a file with the same name already exists in the outfiles directory.

Setting up the HostFiles Plugin

s2eget and s2eput require configuring the HostFiles plugin in the S2E configuration file (s2e-config.lua). The configuration looks as follows:

plugins = {
    ...

    "HostFiles",
}

pluginsConfig.HostFiles = {
    baseDirs = {
        "/path/to/host/dir1",
        "/path/to/host/dir2",
    },

    -- This option must be enabled for s2eput to work
    allowWrite = true,
}

Note

If you use s2e-env, the basic configuration is already there. You do not have to modify it unless you need to access files that are stored outside of your project folder. Do not change the existing directory configuration (in particular guestfs folder paths).

The pluginsConfig.HostFiles.baseDirs configuration option specifies what directories on the host should be shared with the guest. The paths can be either absolute, relative, or empty. If an empty directory is specified the S2E output directory will be exported.

The pluginsConfig.HostFiles.allowWrite must be set to true for allowing writes to the base directories.