Package: py-shelf
Shelf - Shellcode ELF convert elf to shellcodeConvert standard elf files to standalone shellcodes.
Please read the following documentation and view the examples for this project to work properlyProject linksGithubPypiSupported architecturesmipsi386 (intel x32)x86_64 (intel x64)arm (32bit)aarch64 (arm 64 bit)RISC-V rv64Installation:pipinstallpy_shelfPython version supportpython3How does this work ?The python library parses the elf and create a simple relocatable file format called shelf (shellcode elf).The mini loader is inserted as the entry point for shelf.the mini loader will load and relocate the shelf then it will execute it.
There are no special requirements, the library contain the compiled
mini loaders and resources.The diagram below explain the format (Only work in browsers)classDiagram
    ShellcodeEntryPoint --|> MiniLoader
    ShellcodeEntryPoint: Shellcode containing pre mini loader logic
    MiniLoader --|> Relocation table
    MiniLoader: Contain all the logic for parsing the relocation table
    MiniLoader: fully os independent
    Relocation table --|> HOOKS Optional
    Relocation table : Contain table required for shellcode runtime relocation
    HOOKS Optional --|> SHELF
    HOOKS Optional: Read more about hooks in the documentation below
    HOOKS Optional: This section is optional and only exists if hooks are used
    SHELF: Shellcode elf - This is the compiled binary we convert into shellcode
    SHELF: This binary is stripped into only opcodes
    SHELF: fully relocatable using the relocation tableThis project is intended to convert elf to os independent shellcodes.
Therefor the loader never allocate memory and the shellcode format is not packed.
You can just execute it, eg ...((void(*)())shellcode)();note that __libc_start_main perform syscalls
therefor if you want your shellcode to be fully os independent you must compile with -nostartfilesShelf by default expects RWX (Read Write Execute) memory shelf can run inRX environments (Read Execute) Click the link to read morefollow the examples belowCreating a shellcodeSome compilation flags are required for this to work properly.
You must compile the binary with -fPIE and -static take a look at the provided examples below
(makefile).shellcode is a stripped binary with no symbols and no elf information only opcodes, in order
to make the shellcode this library require a binary with elf information.
so make sure you are not stripping the binary before using this librarysimplified make command for mips big endiangccexample.c-fno-stack-protector-fPIE-fpic-static-nostartfiles--entry=main-obinary.outpython-mshelf--inputbinary.outExamples:MakefileExample.cTesting your shellcodeYou can use the provided shellcodeLoaderto test you shellcodesqemu-mips./shellcode_loader./myshellcode.outUsing the shelf loader libraryit is advised to use the shelf loader library to tests your shellcode
here you can read more about it:Shelf loader documentationAdvanced concepts and featuresfor following links only work on the github pageOpcode relocationsCompiling with libcDynamic shellcodeHooking the mini loaderMitigation bypassOptimizationsOutput formatsPython apiDevelopmentSpecific architecture limitations