Skip to content

Commit 1a379e7

Browse files
author
Sebastian Poeplau
committed
Document the experiments for the paper
This is the same as http://www.s3.eurecom.fr/tools/symbolic_execution/symcc.html; just making sure that it's available in the repo as well.
1 parent 104411d commit 1a379e7

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

docs/Experiments.txt

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
2+
3+
Experiments
4+
5+
6+
Here we document how to reproduce the experiments that we show in the paper
7+
"Symbolic execution with SymCC: Don't interpret, compile!" The same instructions
8+
are available on our website [1], which also provides our raw results. Feel free
9+
to reach out to us if you encounter problems with reproducing the benchmarks.
10+
11+
In the paper, we describe two sets of experiments: we first benchmark SymCC on
12+
the CGC programs, then we run it on real-world software.
13+
14+
15+
CGC experiments
16+
17+
We used the Linux port of the CGC programs by Trail of Bits [2]. SymCC needs to
18+
be built with support for 32-bit compilation (see docs/32-bit.txt; this is not
19+
part of the Dockerfile because it would double the build time of the container
20+
while providing value to just a few users). Then you can simply export
21+
CC=/path/to/symcc, CXX=/path/to/sym++ and SYMCC_NO_SYMBOLIC_INPUT=1, and build
22+
the CGC programs as usual (i.e., by invoking their build.sh script).
23+
24+
Run the programs on the raw PoV inputs [3] with SYMCC_NO_SYMBOLIC_INPUT=1 to
25+
measure pure execution time, and unset the environment variable for symbolic
26+
execution. To assess coverage, we ran afl-showmap with the AFL-instrumented CGC
27+
programs on each generated input and accumulated the resulting coverage maps per
28+
program, resulting in a set of covered map entries for each CGC program. The
29+
sizes of those sets can then be fed to the scoring formula presented in the
30+
paper.
31+
32+
For KLEE and QSYM, we used the setup described in our IR study [3] but with the
33+
regular 32-bit binaries built by cb-multios.
34+
35+
36+
Real-world software
37+
38+
The analysis of real-world software always follows the same procedure. Assuming
39+
you have exported CC=symcc, CXX=sym++ and SYMCC_NO_SYMBOLIC_INPUT=1, first
40+
download the code, then build it using its own build system, finally unset
41+
SYMCC_NO_SYMBOLIC_INPUT and analyze the program in concert with AFL (which
42+
requires building a second time for AFL, see docs/Fuzzing.txt). We used AFL
43+
2.56b and built the targets with AFL_USE_ASAN=1. Note that the fuzzing helper is
44+
already installed in the Docker container.
45+
46+
OpenJPEG [4]: we used revision 1f1e9682, built with CMake as described in the
47+
project's INSTALL.md, and analyzed "bin/opj_decompress -i @@ -o
48+
/tmp/image.pgm"; the corpus consisted of test files file1.jp2 and file8.jp2
49+
[5].
50+
51+
libarchive [6]: we used revision 9ebb2484, built with CMake as described in the
52+
poject's INSTALL (but adding "-DCMAKE_BUILD_TYPE=Release"), and analyzed
53+
"bin/bsdtar tf @@"; the corpus consisted of just a single dummy file
54+
containing the character "A".
55+
56+
tcpdump: we built both tcpdump [7] and libpcap [8]; in order to make the former
57+
find the latter, just place the source directories next to each other in the
58+
same folder. We used revision d615abec of libpcap and revision d57927e1 of
59+
tcpdump. We built first libpcap and then tcpdump with "./configure && make",
60+
and analyzed "tcpdump/tcpdump -e -r @@"; the corpus consisted of just a single
61+
dummy file containing the character "A".
62+
63+
All experiments used one AFL master process, one secondary AFL process, and one
64+
SymCC process. We let them run for 24 hours and repeated each of them 30 times
65+
to create the graphs in the paper; AFL map density was extracted from the
66+
secondary AFL process' "plot_data" file, column "map_size".
67+
68+
The QSYM experiments used an analogous setup, replacing SymCC with QSYM and
69+
running it with AFL according to the QSYM authors' instructions [9].
70+
71+
[1] http://www.s3.eurecom.fr/tools/symbolic_execution/symcc.html
72+
[2] https://github.com/trailofbits/cb-multios
73+
[3] http://www.s3.eurecom.fr/tools/symbolic_execution/ir_study.html
74+
[4] https://github.com/uclouvain/openjpeg.git
75+
[5] https://github.com/uclouvain/openjpeg-data/blob/master/input/conformance
76+
[6] https://github.com/libarchive/libarchive.git
77+
[7] https://github.com/the-tcpdump-group/tcpdump.git
78+
[8] https://github.com/the-tcpdump-group/libpcap.git
79+
[9] https://github.com/sslab-gatech/qsym#run-hybrid-fuzzing-with-afl

0 commit comments

Comments
 (0)