Last update: 29/05/2007


EtatDéveloppement
Version1.01 beta
Mise à jour28/04/2007

Projet ShellKnife
"ShellKnife" est un petit outil permettant d'exécuter rapidement les opérations couramment effectuées sur un shellcode : conversion entre différents formats, recherche de l'offset de valeurs, recherche de valeurs interdites et test.

Principe détaillé
Objectif
Lors du test ou du développement de shellcodes, il est courant d'avoir besoin de convertir un shellcode entre un format C et binaire, de rechercher l'offset d'une suite d'octets, de vérifier que le shellcode ne contient pas certaines valeurs interdites ou également de le tester.
ShellKnife est un petit outil en Python encapsulant ces différentes opérations.
Plateforme
ShellKnife fonctionne sous Windows et sous Linux.
Opérations supportées
ShellKnife peut effectuer les opérations suivantes :
  • convert : convertit un shellcode d'un format à un autre
  • find : recherche l'offset d'un ou d'une suite d'octets
  • checkval : vérifie si le shellcode contient une des valeurs fournies
  • test : lance l'exécution du shellcode et permet également d'ajouter un breakpoint à l'entrée du shellcode
Formats d'entrée
Le shellcode peut être lu et converti dans les formats suivants : binaire, C, Ruby, PERL et Python
Pour les formats C, Ruby, PERL et Python le shellcode peut être lu/écrit sur stdin/stdout
Demo
Conversion C => binaire et écriture du résultat dans shellcode.bin
>ShellKnife.py convert -s C -d bin -o shellcode.bin
Enter shellcode array. End with an empty line
"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xbb\xcc\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"

[INFO ] Shellcode size : 24
[INFO ] Conversion successfull

>dir shellcode.bin
28/04/2007  12:30                24 shellcode.bin

	
Conversion binaire => ruby du shellcode précédent et affichage sur stdout
>ShellKnife.py convert -i shellcode.bin -s bin -d ruby
[INFO ] Shellcode size : 24
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xBB\xCC"+
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"

[INFO ] Conversion successfull
	
Recherche de l'offset de la suite d'octet 0xbb, 0xcc, 0xaa dans le shellcode précédent
>ShellKnife.py find -i shellcode.bin -s bin -f bbccaa
[INFO ] Shellcode size : 24
Value 0xBBCCAA found at offset 14
	
Vérification que le shellcode ne contient par les valeurs 0x00, 0x0a, 0x0d, 0xbb ou 0xcc
>ShellKnife.py checkval -i shellcode.bin -s bin -l 00,0a,0d,bb,cc
[INFO ] Shellcode size : 24
Value 0xBB found at offset 14
Value 0xCC found at offset 15
	
Test du shellcode en breakant au point d'entrée
>ShellKnife.py test -s python -b
Enter shellcode array. End with an empty line
"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xbb\xcc\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"


	
Sous windows, un debugger doit avoir été configuré pour intercepter les points d'arrêts. Par exemple, avec OllyDbg :
Sous linux, c'est gdb qui est utilisé :
# ./ShellKnife.py test -s python -b
Enter shellcode array. End with an empty line
"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xbb\xcc\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"

GNU gdb 6.4.90-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".

Failed to read a valid object file image from memory.
Shellcode size = 24
Jumping to shellcode

Program received signal SIGTRAP, Trace/breakpoint trap.
0x0804a171 in ?? ()
1: x/10i $pc
0x804a171:      stos   %al,%es:(%edi)
0x804a172:      stos   %al,%es:(%edi)
0x804a173:      stos   %al,%es:(%edi)
0x804a174:      stos   %al,%es:(%edi)
0x804a175:      stos   %al,%es:(%edi)
0x804a176:      stos   %al,%es:(%edi)
0x804a177:      stos   %al,%es:(%edi)
0x804a178:      stos   %al,%es:(%edi)
0x804a179:      stos   %al,%es:(%edi)
0x804a17a:      stos   %al,%es:(%edi)
	
Installation
Décompressez l'archive
Sous Linux, pensez à remettre les droits d'exécution sur ShellKnife.py et shellcodetester
L'archive contient également les sources de shellcodetester et deux makefile pour Linux/Windows pour recompiler l'exécutable.
Ressources
Cette archive contient le script Python ShellKnife et les ressouces pour "shellcodetester"
Une remarque/un bug ?
Ce projet a été mis en ligne récemment, merci de me faire part de vos remarques/suggestions pour l'améliorer: Benjamin CAILLAT