Caezar ASCII Shellcode Generator (x86, 32 bits)

VincentDary 48f41ff883 First commit. 7 years ago
demo 48f41ff883 First commit. 2 years ago
AllocFunctions.c 48f41ff883 First commit. 2 years ago
AllocFunctions.h 48f41ff883 First commit. 2 years ago
AsciiShellEngine.c 48f41ff883 First commit. 2 years ago
AsciiShellEngine.h 48f41ff883 First commit. 2 years ago
CmdLineTtmt.c 48f41ff883 First commit. 2 years ago
CmdLineTtmt.h 48f41ff883 First commit. 2 years ago
LICENSE 48f41ff883 First commit. 2 years ago 48f41ff883 First commit. 2 years ago
main.c 48f41ff883 First commit. 2 years ago
makefile 48f41ff883 First commit. 2 years ago

PolyAsciiShellGen: Caezar ASCII Shellcode Generator

Full description and demonstration on this blog post:


PolyAsciiShellGen is an experimental ASCII shellcode generator based on the part II of the Riley "Caezar" Eller's paper. The program take a classic shellcode in entry and automates the shellcode encoding process into ASCII caracteres and assemble an ASCII shellcode able to decode, load and execute the original shellcode.


Clone PolyAsciiShellGen from my Github repository [3] and build it.

$ git clone
$ cd PolyAsciiShellGen
$ make && make clean


$ ./PolyAsciiShellGen
usage: PolyAsciiShellGen <esp offset> <nop sleed factor N * 4 NOPS> <shellcode "\xOP\xOP"...>


<esp offset>

The esp offset parameter is a 32 bit integer, positive or negative. When the generated ASCII shellcode is executed it starts to add the esp offset to ESP in order to set the register position after its code with enough space to build the decoded shellcode as a bridge to the code of the ASCII shellcode. This value is generaly deduct during a pre-exploitation debugging session. If a NOP sleed is add before the decoded shellcode via the NOP sleed factor, the esp offset value can have a margin of error according the size of the NOP sleed use. Here the method to compute the esp offset.

 esp_offset = @shellcode_ascii_start_address - @esp_address
              + ascii_shellcode_size
              + original_shellcode_size

Note: the ascii_shellcode_size must be padded on a 32-bit boundary.

<nop sleed factor>

The nop sleed factor parameter is a 32 bit unsigned integer use as a NOP sleed multiplier to add an extra NOP sleed before the first instructions of the decoded shellcode in order to reliable the decoded shellcode execution. This factor is multiplied to four NOP instructions. So if N=4, 4*4=16 NOP instructions are added before the shellcode.


The shellcode parameters is the shellcode to encode in escaping format ...\xcd\x80... .If the lenght of the shellcode is not a multiplier of four bytes, it is padded with extra NOP bytes in order to pass an exploit code aligned on a 32-bit boundary to the underlying ASCII shellcode generator.


PolyAsciiShellGen print the resulting ASCII shellcode on the standard output. The ASCII charset use for the ASCII shellcode building is the following.


To encode the original shellcode, the underlying encoder uses values generated randomly at each execution. So, the printable shellcodes generated have a different signatures from the original shellcode at each new generation.

Return Value

The command returns 0 if the ASCII shellcode generation is successful or 1 if it fails.


Here an example with a setresuid(0,0,0); execve(/bin//sh,0,0) shellcode.

$ ./PolyAsciiShellGen -270  10  "\x31\xc0\x31\xdb\x31\xc9\x31\xd2\xb0\xa4\xcd\x80\x31\xc0\xb0\x0b\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x51\x89\xe2\x53\x89\xe1\xcd\x80"