The Binary String Toolkit or BST for short is a rather simple utility to convert binary strings to various formats suitable for later inclusions in source codes, such as those used to develop exploits in the security field.

Features
  • Dump files content to standard output in a binary string format.
  • Convert a plain hexadecimal input to an escaped binary string.
  • Output a sequence of bad characters for testing proof of concept code.
  • Limit the width of binary strings for better readability in source codes.
  • Format output in your favorite programming language’s syntax.
  • Perform binary variable block indentation.

Dependencies

  • POSIX C Library
  • C Compiler
    • GCC
    • LLVM Clang
  • GNU Make
  • Git

Building
To build and install the ‘bstrings’ binary, simply do:

$ git clone https://github.com/e3prom/bst
$ cd bst
$ make
# by default, bstrings is installed in /usr/local/bin.
$ make install

Usage
The below example show how an assembled shellcode can be quickly dumped (-D) to standard output in a hexadecimal escaped (-x) binary string of 16 hexadecimal digits width (or 8 bytes), with Python syntax formatting and an indentation of 4 space characters:

$ bstrings --verbose -x -D lnx-execve-setreuid-x86_64 -w8 -i 4 --syntax=python
[*] Convert hexadecimal input to an escaped binary string.
[+] Binary string width is limited to 8 bytes.
[+] Output binary string using python language syntax.
[+] Indentation level set to 4 space character(s).
shellcode = ""
shellcode += "x31xc0x48x89xc7x48x89xc6"
shellcode += "x48x89xc2xb0x71x0fx05x31"
shellcode += "xc0x50x48xbbx2fx62x69x6e"
shellcode += "x2fx2fx73x68x53x48x89xe7"
shellcode += "x50x48x89xe6x57x48x89xe2"
shellcode += "xb0x3bx0fx05"

You can also use bstrings to output an automatically indented bad character sequence, and thus in your favorite programming language:

$ bstrings --verbose -b -w12 -i 4 --syntax=c -n badchar
[*] Generating bad character binary string.
[+] Binary string width is limited to 12 bytes.
unsigned char badchar[] =
"x01x02x03x04x05x06x07x08x09x0ax0bx0c"
"x0dx0ex0fx10x11x12x13x14x15x16x17x18"
"x19x1ax1bx1cx1dx1ex1fx20x21x22x23x24"
"x25x26x27x28x29x2ax2bx2cx2dx2ex2fx30"
"x31x32x33x34x35x36x37x38x39x3ax3bx3c"
"x3dx3ex3fx40x41x42x43x44x45x46x47x48"
"x49x4ax4bx4cx4dx4ex4fx50x51x52x53x54"
"x55x56x57x58x59x5ax5bx5cx5dx5ex5fx60"
"x61x62x63x64x65x66x67x68x69x6ax6bx6c"
"x6dx6ex6fx70x71x72x73x74x75x76x77x78"
"x79x7ax7bx7cx7dx7ex7fx80x81x82x83x84"
"x85x86x87x88x89x8ax8bx8cx8dx8ex8fx90"
"x91x92x93x94x95x96x97x98x99x9ax9bx9c"
"x9dx9ex9fxa0xa1xa2xa3xa4xa5xa6xa7xa8"
"xa9xaaxabxacxadxaexafxb0xb1xb2xb3xb4"
"xb5xb6xb7xb8xb9xbaxbbxbcxbdxbexbfxc0"
"xc1xc2xc3xc4xc5xc6xc7xc8xc9xcaxcbxcc"
"xcdxcexcfxd0xd1xd2xd3xd4xd5xd6xd7xd8"
"xd9xdaxdbxdcxddxdexdfxe0xe1xe2xe3xe4"
"xe5xe6xe7xe8xe9xeaxebxecxedxeexefxf0"
"xf1xf2xf3xf4xf5xf6xf7xf8xf9xfaxfbxfc"
"xfdxfexff"

For a list of supported command-line options, simply execute bstrings with the ‘–help’ switch:

$ bstrings --help
Usage: ./bstrings [OPTION]...
Convert input to specified binary string format.

At least one of the below options must be given:
-D, --dump-file=FILE Dump content of file FILE in hexadecimal format
-x, --hex-escape Escape input hexadecimal string
-b, --gen-badchar Generate a bad character sequence string

The below switches are optional:
-f, --file=FILE Read input from file FILE instead of stdin
-w, --width=BYTES Break binary strings to specified length in bytes
-s, --syntax=LANG Output variable using language syntax of LANG
-i, --indent=LENGTH Perform indentation for given character length
-n, --var-name=VAR Specify binary string variable name (verbose)
-h, --help Display this help
--interactive Enter interactive mode
--verbose Enable verbose output
--version Print version information

The below languages are supported (case-sensitive):
C C Programming language
python Python Programming language