Hey, I’m back with my solution for assignment 4 (of 7). This time, I show you my custom shellcode encoder (written in Python, yeah) and the according assembly decoding stub.
This blog post has been created for completing the requirements of the SecurityTube Linux Assembly Expert certification:
Student ID: SLAE-890
The encoding scheme is based on the “Insertion encoding scheme” we learned about in the course. I refined it a bit to make it less obvious and also wrote my own Python script to generate stub+shellcode – ready to paste 🙂
Source codes are – as always – on my github page! Now, let’s start rolling.
First, let me explain the algorithm. It’s basically taking a shellcode byte, generating a random offset (int number), subtracting the offset from the shellcode byte and storing both bytes again (in the new shellcode). Not very space-efficient since it’s doubling the shellcode bytes … but so what. Many variations are possible (like have only one offset or a new offset every x bytes or or or …) – I’ll maybe try that at a later time.
The Python code to generate the obfuscated shellcode, looks like this:
The matching decoder (assembly) looks like this:
I wrote a small Python program (the allmighty Diffuscator) to get shellcode from STDIN, encode it and prepend the decoder stub to it. The resulting byte code will be printed out, ready for easy copy&paste 🙂
To test my stuff, I took a random shellcode from shell-storm. I found a nice and short one which prints /etc/passwd. Running it through my Python tool, it looks like this:
Now we just paste in the new shellcode into a skeleton shellcode.c, compile and run it – et voilà – check out my sweet /etc/passwd 🙂
Sending this shellcode through virustotal … not too bad, eh?
Hope you find this useful! Talk soon 🙂