Home | History | Annotate | only in /external/honggfuzz/examples/terminal-emulators
Up to higher level directory
NameDateSize
libclose.c21-Aug-2018717
Makefile21-Aug-2018328
README.md21-Aug-20183.4K
terminal-test.c21-Aug-20182.8K

README.md

      1 # Fuzzing terminal emulators #
      2 
      3 ## Step 1: Prepare libclose.so and terminal-test ##
      4 
      5 ```
      6 $ cd /home/jagger/src/honggfuzz/examples/terminal-emulators/
      7 $ make
      8 ../../hfuzz_cc/hfuzz-clang -std=c99  -o terminal-test terminal-test.c
      9 cc -std=c99  -shared -o libclose.so libclose.c
     10 ```
     11 
     12 *libclose.so* serves one purpose only: when preloaded (with _LD_PRELOAD=libclose.so_)
     13 it will prevent file-descriptors *1022* and *1023* (used by honggfuzz for coverage
     14 feedback accumulation) will not be closed by the fuzzed binary (terminal emulator)
     15 before passing to the _terminal-test_ binary.
     16 
     17 The *terminal-test* program will feed the terminal emulator with data from the
     18 fuzzing engine, and will try to read back any data that the terminal can produce.
     19 See the _Bonus: term.log_ secion on why it might matter.
     20 
     21 ## Step 2: Instrument your terminal emulator ##
     22 
     23 Add compiler-time instrumentation to your fuzzed terminal emulator. Typically it
     24 would consist of the following sequence of commands (for xterm):
     25 
     26 ```
     27 $ cd xterm-327
     28 $ CC=/home/jagger/src/honggfuzz/hfuzz_cc/hfuzz-clang CXX=$CC ./configure
     29 ...
     30 ...
     31 $ CC=/home/jagger/src/honggfuzz/hfuzz_cc/hfuzz-clang CXX=$CC make -j4
     32 ```
     33 
     34 Alternatively, you might want to compile it with ASAN enabled, for better
     35 detection of memory corruption problems
     36 
     37 ```
     38 $ cd xterm-327
     39 $ HFUZZ_CC_ASAN=1 CC=/home/jagger/src/honggfuzz/hfuzz_cc/hfuzz-clang CXX=$CC ./configure
     40 ...
     41 ...
     42 $ HFUZZ_CC_ASAN=1 CC=/home/jagger/src/honggfuzz/hfuzz_cc/hfuzz-clang CXX=$CC make -j4
     43 ```
     44 
     45 ## Step 3: Create initial input corpus ##
     46 
     47 It can consist even of a single file.
     48 
     49 ```
     50 $ mkdir IN
     51 $ echo A >IN/1
     52 ```
     53 
     54 ## Step 4: Launch it! ##
     55 
     56 ```
     57 $ /home/jagger/src/honggfuzz/honggfuzz -z -P -f IN/ -E LD_PRELOAD=/home/jagger/src/honggfuzz/examples/terminal-emulators/libclose.so -- xterm-327/xterm -e /home/jagger/src/honggfuzz/examples/terminal-emulators/terminal-test
     58 ```
     59 
     60 Typical output:
     61 ```
     62 ----------------------------[ honggfuzz v1.0alpha ]---------------------------
     63   Iterations : 4,865,546 [4.87M]
     64        Phase : Dynamic Main (2/2)
     65     Run Time : 0 hrs 0 min 15 sec
     66    Input Dir : [865] 'IN/'
     67   Fuzzed Cmd : './xterm -e /home/jagger/src/honggfuzz/examples/terminal-em...'
     68      Threads : 4, CPUs: 8, CPU: 733% (91%/CPU)
     69        Speed : 320,951/sec (avg: 324,369)
     70      Crashes : 0 (unique: 0, blacklist: 0, verified: 0)
     71     Timeouts : 0 [10 sec.]
     72  Corpus Size : 265, max file size: 1,024
     73     Coverage : bb: 850 cmp: 35,516
     74 -----------------------------------[ LOGS ]-----------------------------------
     75 NEW, size:912 (i,b,sw,hw,cmp): 0/0/1/0/1, Tot:0/0/772/0/32216
     76 NEW, size:940 (i,b,sw,hw,cmp): 0/0/1/0/32, Tot:0/0/773/0/32248
     77 NEW, size:919 (i,b,sw,hw,cmp): 0/0/0/0/9, Tot:0/0/773/0/32257
     78 NEW, size:1024 (i,b,sw,hw,cmp): 0/0/0/0/2, Tot:0/0/773/0/32259
     79 NEW, size:1013 (i,b,sw,hw,cmp): 0/0/0/0/1, Tot:0/0/773/0/32260
     80 ...
     81 ...
     82 ```
     83 
     84 ## Bonus: term.log ##
     85 
     86 The *term.log* file will contain interesting data which can be fetched from the
     87 terminal emulator's input buffer. It will typically contains responses to ESC
     88 sequences requesting info about terminal size, or about the current color map.
     89 But, if you notice there arbitrary or binary data, basically something that
     90 a typical terminal shouldn't responsd with, try to investigate it. You might
     91 have just found and interesting case of RCE, where arbitrary data can
     92 be pushed into terminal's input buffer, and then read back (and potentially
     93 executed) with whatever runs under said emulator (e.g. _/bin/bash_)
     94