Dpassement de capacit de la pile
Etude des exploitations avances de stack overflow, criture de shellcodes polymorphiques et
alphanumriques
Gross David Alias Deimos ltdeimosfuturezone.bizgt avril
Table des matires
. Introduction ................................................................................................................. .
Rappels des concepts de base ................................................................................... ..
Organisation de la mmoire sous GNU/Linux ............................................ .. Le langage
assembleur .................................................................................... .. Utilisation de logiciels de
dbogage ............................................................. . Exploitation basique de stack overflow
................................................................. .. Prsentation dun cas de stack overflow
...................................................... .. Prise de contrle du flux dexcution
........................................................... .. Programmation de shellcode basique et exploitation
................................. .. Exemples de shellcode
.................................................................................... . Techniques avances de
programmation de shellcode ...................................... .. Shellcode polymorphique
............................................................................... .. Shellcode alphanumrique
.............................................................................. ... Instructions disponibles
............................................................................ ... Lalgorithme dencodage
......................................................................... ... Substitution dinstructions
....................................................................... ... Structure globale du shellcode
................................................................ ... Mise en application
................................................................................... ... Exploitation
................................................................................................ .. Camouflage de NOPs
......................................................................................
. Technique avance dexploitation de stack overflow ......................................... .. ret into
linuxgate.so. ............................................................................. ... Prsentation de la mthode
...................................................................... ... Exploitation
................................................................................................ ... Protection possible
..................................................................................... .. ret into .text
................................................................................................. .. Exploitation en local
........................................................................................
. Conclusion .................................................................................................................... .
Remerciements ............................................................................................................ .
Rfrences .................................................................................................................... .
Annexes .........................................................................................................................
Cest en effectuant des tests dexploitation de stack overflow avec ces shellcodes que je me
suis rendu compte des nombreuses protections prsentes en local en plus des protections
prsentes lors dune attaque distance. lcriture mais surtout la prparation de ce texte mont pris
un temps considrable et jespre avoir des retours positifs de ce travail. Introduction Avant de
se lancer dans le vif du sujet.. Jai ainsi largi le sujet de cet article. javais pour objectif dcrire
un article uniquement sur les shellcodes polymorphiques et de lapprofondir en dcrivant la
programmation de shellcode entirement alphanumrique i.e. do la rdaction des parties et . Je
suis actuellement tudiant en premire anne de DUT informatique . comme par exemple la
randomisation de ladresse de base de la pile sous GNU/Linux depuis le kernel . tous les
opcodes compris dans les valeurs azAZ afin de dmontrer les faiblesses potentielles des
NIDS. . et en mme temps dcid de le destiner un plus large public. destines aux dbutants ou
aux individus ne stant jamais penchs sur les failles de dpassement de tampon buffer
overflow. Je mexcuse davance pour toutes les fautes et manques de prcisions que vous
pourrez trouver dans ce document. Nhsitez donc pas me contacter afin que je corrige ou
complte celuici jessayerai de toute faon de le tenir jour quant lvolution de la scurit
informatique ou pour me faire part de vos critiques constructives et commentaires.. Ctait un
sujet que je trouvais trs intressant et ma motivation produire un texte sur les shellcodes
alphanumriques tait pousse par le fait que je nai pas vu jusqu prsent de document franais sur
ce sujet. A la base. je tiens me prsenter afin que le lecteur sache qui se cache derrire ce
document et en profiter pour prciser certains points concernant ce texte.
etc. et non pas une documentation exhaustive permettant un apprentissage complet de ces
notions. pour de nombreuses raisons videntes. De plus certaines connaissances ncessaires
la lecture de ce document ne seront pas rappeles. bien que les scripts Perl prsents dans cet
article ne sy trouvent quen guise de Proof of Concept .En effet jy dcrirai lorganisation de la
mmoire sous GNU/Linux. la manipulation de certains outils GNU/Linux. comme la
programmation en C voire Perl. Il sagit donc de simples rappels afin de se rafraichir la
mmoire sur certains points. les gnralits du langage machine. .
ElfPhdr et ElfShdr sont dtailles dans les annexes de ce document. . les fichiers binaires
excutables sont du format ELF Executable and Linking Format.. Voici la structure globale
dun fichier ELF Les structures pour processeur i ElfEhdr. Organisation de la mmoire sous
GNU/Linux Sous les systmes GNU/Linux.. Pour les binaires excutables au format x. se rfrer
au manpage du format elf. Rappels des concepts de base .
so.data elle contient toutes les donnes globales initialises La section . On distingue ainsi un
peu moins dune trentaine de type de sections.hgt int i.Lorsquun excutable est lanc.bss char
c A. Il nest toutefois ncessaire de retenir uniquement La section . il sagit du fichier objet
partag /lib/ldlinux. allocation et excution. en tenant compte des champs pfilez la taille du
segment dans le fichier et pmemsz la taille du segment en mmoire. Pour chaque segment le
champ pflags dfinit les droits en excution. criture et lecture.data . et rcupre une chaine de
caractres qui correspond linterprteur. le systme dexploitation va chercher dans la Program
Header Table le segment dont le champ ptype correspond la valeur PTINTERP. chaque
processus dispose dune pile stack qui contiendra les variables locales et dun tas o seront
stocks les variables alloues dynamiquement avec la fonction malloc en C.hgt include ltstdio..
lespace user tant situ entre x et xbfffffff et lespace kernel entre xc et xffffffff. cestdire xbfffffff .
// . Il prend ensuite la valeur du champ poffset afin de localiser le segment dans le fichier
ELF. La pile crot vers les adresses basses. qui est optionnelle dans les fichiers binaires
excutables.bss elle contient toutes les donnes globales noninitialises De plus. donne des
informations supplmentaires sur les diffrentes sections grce au champ shtype qui spcifie le
contenu du segment et shflags qui dfinit les droits en criture. En gnral. La Section Header
Table.text elle contient les opcodes code machine du programme excuter La section . et
ladresse de base de celleci se situe vers les adresses hautes de lespace utilisateur user
land. loprateur new en C. Pour rsumer et obtenir davantage dinformations. sous GNU/Linux.
// . passons la pratique include ltmalloc. Celuici est ainsi le premier tre mapp en mmoire. et
cest lui qui va parcourir nouveau la Program Header Table afin de mapper tous les segments
de type PTLOAD avec le syscall mmap.
char env int j.data xxnquot quotargv xxnquot quotargv xxnquot quotenv xxnquot quotenv
xxnquot quotstack xxnquot quotheap xxnquot. char argv. while sleep. env. printfquotPID
dnquot quot. deimosltbx/memory gcc ggdb o mem mem. ampc. k. ampi. env.int mainint
argc.text xxnquot quot. argv.data x argv xbfbdba argv xbfbfcf env xbfbdbb env xbfbfca stack
xbfbdb heap xa Petite vrification de ladresse des arguments et de lenvironnement dans la
pile. Le binaire .bss xxnquot quot.bss x . // stack char k char mallocsizeofchar. ampj. les
variables denvironnement tant situes juste au dessus des arguments xbfbfca ./mem a t lanc
dans le shell avec un argument la chaine . .c deimosltbx/memory ./mem plop PID .
argv.xbfbfcf xB ./mem plop . getpid.text xf ./mem correspondant argv fait bien caractres en
comptant le caractre final NULL. main.
T start D c B i f T main Avec ces informations. D la section .De plus. deimosltbx/memory nm
mem . Le symbole B reprsente la section .bss..text.data et T la section . qui permet de lister
les symboles dun fichier objet. lutilitaire nm. on peut facilement reprsenter la mmoire dun
processus par ce schma volontairement simplifi . nous assure que chaque variable est dans
la bonne section..
so bfdbfdb rwp /lib/tls/libc.. stat informations diverses sur ltat du processus seul le champ
startstack nous intresse deimosltbx/memory .so bfbbbfb rwp bfbb stack deimosltbx/memory
cat /proc//stat mem S deimosltbx/memory ... s pour le partage et p pour le statut priv.so bb
rwp /lib/ld. Dans chaque rpertoire /proc/pid/. w pour criture.. on peut connatre de nombreuses
informations sur celuici grce au systme de fichiers virtuel /proc. ainsi que les droits pour
chacune dentre elles r pour lecture. x pour lexcution. un sousrpertoire est cr dans /proc avec
comme nom son Processus ID.Lorsquun processus est lanc./mem amp deimosltbx/memory
cat /proc//maps rxp /home/deimos/memory/mem a rwp /home/deimos/memory/mem ab rwp
a heap beabea rwp bea beabfd rxp /lib/tls/libc..... chaque processus lanc. on trouve environ
ce fichier contient les variables denvironnement du processus maps ce fichier rend
lutilisateur les dbuts et fin de sections mappes en mmoire. En effet. Bien videmment nous ne
verrons que les points qui nous serviront plus tard dans notre tude des exploitations et
protections de buffer overflow.so bfdbbfdd rwp bfdb bfebfe rwp bfe bfebfea rxp bfe vdso
bfeab rxp /lib/ld.
ebx movb al. bien que un peu moins logique que la syntaxe ATampT.deimosltbx/memory
cat /proc//environ tr quotquot quotnquot TERMxterm SHELL/bin/bash
XDMMANAGED/var/run/xdmctl/xdmctl. source mov eax.maysd.methodclassic USERdeimos
PWD/home/deimos/memory LANGfrFReuro SHLVL HOME/home/deimos
LANGUAGEfrFRfrenGBen LOGNAMEdeimos DISPLAY. dsxebp movw esxfebx.mayfn. dest
movl x.x jmp eax ./mem OLDPWD/home/deimos deimosltbx/memory . al mov esebxecxxf.
COLORTERM .ecx. en effet elle est moins lourde tant allge de tous les prfixes des oprandes.
eax movl eax. Exemple dinstruction basique en syntaxe NASM gauche et ATampT droite
mnemonique dest. eax mov dsebpx. Le langage assembleur De solides connaissances du
langage assembleur seront galement ncessaires pour la suite de ce document. x mov ebx.
ax jmp near eax mnemonique source.. Nous allons donc revoir rapidement deux syntaxes
assembleur la syntaxe ATampT car elle est utilise par gdb Gnu debugger et la syntaxe
NASM Netwide Assembler car les shellcodes seront programms avec celleci .sched.
dnquot.c Voyons prsent comment ce code C est interprt en assembleur et de quelle manire
sont grs la pile et les appels de fonction. ESP. deimosltbx/memory cat gtfunc. printfquotd. j.
ECX. EBX. Pour cela. EIP ESP correspond au pointeur du sommet de la pile Stack Pointer
EIP contient ladresse de la prochaine instruction excuter Instruction Pointer Les registres
EFLAGS . nbr.hgt void foobarint nbr.Un bref rappel des diffrents registres disponibles sur un
processeur i Les registres gnraux EAX. ESI. int main int i . EDX Les registres doffset EDI.
nbr. . int nbr. le dbogueur qui nous servira plus tard sous GNU/Linux. deimosltbx/memory
gcc ggdb o func func. int nbr int local. EBP.. int j . il suffit de dsassembler la fonction int main
et la fonction void foobarint nbr. return . Utilisation de logiciels de dbogage Dans cette
section nous allons rapidement passer en revue les principales commandes de gdb.c include
ltstdio. foobari.
esp xa ltfoobargt mov xcebp.eax xac ltmaingt add x.esp xaf ltmaingt pop ecx xb ltmaingt pop
ebp xb ltmaingt lea xfffffffcecx.esp xa ltmaingt call x ltfoobargt xa ltmaingt mov x. .xfffffffebp
xe ltmaingt movl x.esp x ltmaingt movl x. gdb disass main Dump of assembler code for
function main x ltmaingt lea xesp.eax x ltfoobargt mov eax.deimosltbx/memory gdb func gdb
disass foobar Dump of assembler code for function foobar x ltfoobargt push ebp x ltfoobargt
mov esp.eax x ltmaingt mov eax.esp xd ltmaingt pushl xfffffffcecx x ltmaingt push ebp x
ltmaingt mov esp.esp xf ltfoobargt call x ltprintfpltgt x ltfoobargt leave x ltfoobargt ret End of
assembler dump.eax xf ltmaingt mov eax.eax xd ltfoobargt mov eax.xesp x ltfoobargt mov
xebp.xesp x ltfoobargt movl xc.xesp xc ltmaingt mov xfffffffebp.esp xb ltmaingt ret End of
assembler dump.xfffffffebp x ltmaingt mov xfffffffebp.ebp x ltmaingt push ecx x ltmaingt sub
x.ecx xa ltmaingt and xfffffff.ebp x ltfoobargt sub x.
ebp ecx x.dnquot. lopration inverse seffectue.On remarque quune fonction toujours un
prologue qui sauvegarde le Base Pointer en lempilant push et qui est substitu par le Stack
Pointer courant. gdb b xf Breakpoint at xf file func. gdb run Starting program
/home/deimos/memory/func Breakpoint . avec linstruction leave qui correspond un mov
ebp.c printfquotd.esp x ltmaingt x ltmaingt x ltmaingt x ltmaingt push mov push sub ebp esp.
esp . nbr. esp le processus rserve yy octets sur la pile afin dy stocker les variables locales.
Voici le prologue en question x ltfoobargt push ebp x ltfoobargt mov esp. Puis avec un sub
xyy. nbr at func. nbr. Il sert rcuprer les arguments passs la fonction ainsi qu rtablir
lenvironnement de dpart en fin de fonction.ebp x ltfoobargt sub x. Linstruction ret quant elle
est lquivalent de pop eip.esp En fin. line . pop ebp. d n xd ltFRAMEENDgt .c. de fonction. xf
in foobar nbr. gdb p esp void xbfba gdb x/xw esp xbfba xc x x gdb x/c xc xc ltIOstdinusedgt d
.
La commande x/xw esp affiche mots longs double words en hexadcimal au sommet de la
pile.En plaant un breapoint sur le call de notre fonction printf. . et nos deux valeurs. et x/c xc
affiche octets en ASCII ladresse mise en paramtre. on peut vrifier que le registre ESP pointe
bien vers les trois arguments ladresse de la chane de caractres pour le format daffichage.
patch sur gcc tels que StackShield / PaX. Prsentation dun cas de stack overflow Un stack
overflow. ceci provoquant lcrasement de donnes sensibles. Comme son nom lindique.. ou
dpassement de pile. deimosltbx/stackoverflow cat gtvuln.hgt void fooconst char buf char
buffer. puis le crash de lapplication. . buf. Cette vulnrabilit est redoutable tant donn que
lattaquant lexploite en injectant en mmoire du code que lapplication excute. compilateur
StackGuard. Dans la plupart des cas de stack overflow. ce bug reprsente une faille de scurit
qui peut tre exploite soit en local. Exploitation basique de stack overflow .. Toutefois elle
reste assez complexe mettre en uvre car les protections contre ce type de failles se
multiplient protection antidpassement de tampon depuis gcc . return .c // A compiler avec
fnostackprotector a partir de gcc . il sagit dun bug dans un excutable laissant lutilisateur la
possibilit de stocker dans la pile plus doctets que prvu.. soit distance on parle dexploitation
en remote. Ce dysfonctionnement est d le plus souvent une inattention durant la phase de
programmation du binaire par les dveloppeurs. int mainint argc. strcpybuffer. include ltstring.
est un cas spcifique de buffer overflow dpassement de tampon. flag /GS sous Microsoft
Visual C. . char argv ifargc gt fooargv.
/vuln
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AA AAAAAAAAA. qui va contenir ESP prologue de la fonction foo deimosltbx/stackoverflow
gcc ggdb o vuln vuln. si lutilisateur entre un argument dont la taille est suprieure caractres un
caractre ASCII quivaut un octet. dont la taille nest pas vrifie. En effet. Program terminated
with signal . Comme expliqu deux paragraphes plus tt. la fonction void fooconst char buf
recopie dans buffer qui fait octets la chane de caractres passe en paramtre. cestdire return .c
deimosltbx/stackoverflow . qui pointe sur linstruction suivante. Dans cet excutable./vuln
deimosltbx/stackoverflow ulimit c deimosltbx/stackoverflow ./vuln core Core was generated
by . cest le er argument du programme qui est recopi dans buffer. on constate que les
variables locales dune fonction sont prcdes de EBP puis de la sauvegarde de EIP sur
laquelle le programme doit retourner lors de linstruction RET de la fonction./vuln perl e print
quotAquotx.Le programme prcdent est un des exemples les plus basiques de stack overflow.
des donnes seront crases dans mmoire. Segmentation fault. x in gdb p ebp void x gdb p eip
void x gdb x/x esp xbfa x x x x xbfa x x x x xbfa x x gdb quit . Erreur de segmentation core
dumped deimosltbx/stackoverflow gdb . Quelles seront ces octets de la pile sur lesquels
lutilisateur va crire Si lon revient au schma de la mmoire prsent dans le chapitre prcdent.
1 / 26 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !