SlideShare uma empresa Scribd logo
1 de 64
Baixar para ler offline
DANS
LES
ENTRAILLES
DU
LANGAGE
C

No#ons
de
bases
pour
comprendre
les
technique
d’exploit
en
C

ATTENTION
!



     Ce/e
présenta7on
s'appuie
en
grande
par7e
sur
l'excellent
livre

       de
Jon
Erickson
"Hacking,
the
art
of
exploita7on".


     

     

     Les
programmes
en
C
qui
seront
écrits
puis
étudiés
ne
sont
que
le

       prétexte
à
un
décor7cage
un
peu
poussé
du
code.

     

     

     Ce/e
présenta7on
est
un
cours
introduc7f
à
une
seconde
session

       de
pra7que
d'exploit
en
C
sur
un
vieux
noyau
Linux
.




                                                                2

SOMMAIRE

  Back
to
the
basics




  Concepts
de
C
à
travers
le
scope
du
deboggueur




  Memory
segmenta#on





                                                     3

SOMMAIRE

Back
to
the
basics



    Programmes
simples
en
C

    Le
GNU
Compiler
Collec7on
(GCC)

    Le
processeur
x86
(Intel)

    Instruc7ons
assembleur
pour
x86


    Quelques
commandes
u7les
pour
GDB



  Concepts
de
C
à
travers
le
scope
du
deboggueur




  Memory
segmenta#on


                                                     4

SOMMAIRE

Back
to
the
basics




  Concepts
de
C
à
travers
le
scope
du
deboggueur



  Chaînes
de
caractères
(strings)

  Signedness

  Pointeurs

  Typecas0ng


  Arguments
en
ligne
de
commande

  Portée
des
variables


  Memory
segmenta#on


                                                     5

SOMMAIRE

Back
to
the
basics




  Concepts
de
C
à
travers
le
scope
du
deboggueur




  Memory
segmenta#on



  Segments
de
la
mémoire

  No7on
de

stack
(«
pile
»
mémoire)
 La
prochaine
fois
!

  No7on
de
heap
(«
tas
»)

  Principes
des
techniques
d’overflow


                                                     6

BACK
TO
THE
BASICS





                      7

CODING
TIME
!



     Ecrire
un
programme
en
C
pour

     

       Afficher
10
fois
la
chaine
de
caractères
"Hello
Word
!"


       A
la
compila7on:
ne
pas
oublier
l'op7on
–g

     (u7le
ultérieurement
pour
le
debug)





                                                                 8

BACK
TO
THE
BASICS

Un
programme
simple
en
C


#include <stdio.h>

int main(){
      int i;
      for (i = 0; i < 10; i++){
            printf("Hello world !n");
      }
      return 0;
}


Compiler
le
programme
pour
l'éxecuter



Avec
le
GNU
Compiler
Collec7on
(GCC):
 

#
gcc
‐g
prog.c
 
‐>

a.out*
          



ou

#
gcc
–g
prog.c
–o
prog 
‐>
prog*



                                           9

BACK
TO
THE
BASICS

Le
rôle
du
compilateur




C'est
un
traducteur
de
code
d'un
langage
(langage
source)
vers
un
autre

(langage
cible).





Exemples:

o  GCC:
GNU
Compiler
Collec7on
pour
le
C,
C++
essen7ellement

o  Javac,
compilateur
Java

o  Clang
pour
langages
de
la
famille
C

o  GHC
pour
le
Haskell



En
ce
qui
nous
concerne,
le
langage
cible
est
le
langage
compréhensible
par

l'ordinateur
pour
qu'il
exécute
nos
commandes.

  Langage
assembleur





                                                                  10

BACK
TO
THE
BASICS

Op#misa#on
du
code
par
le
compilateur



Le
compilateur
va
généralement
chercher
à
op7miser
le
code
cible:

  Améliora7on
de
la
vitesse
d'exécu7on
(ré‐ordonnancement
des

     instruc7ons)

  Réduc7on
de
l'occupa7on
mémoire
du
programme




   Que
dit
man
gcc
?





 Without
any
op0miza0on
op0on,
the
compiler's
goal
is
to
reduce
the
cost

  of
compila0on
and
to
make
debugging
produce
the
expected
results.



  

                                            

  Turning
on
op0miza0on
flags
makes
the
compiler
a@empt
to
improve
the

  performance
 and/or
 code
 size
 at
 the
 
 expense
 of
 compila0on
 0me
 and

  possibly
the
ability
to
debug
the
program.

  

  Op7ons:
–O0
(default)

–O1

–O2

–O3...

  
                                                                    11

BACK
TO
THE
BASICS

Compilateur
vs
interpréteur



Certains
langages
ne
sont
pas
compilés.
L'interpréteur
lit
et
analyse
un

"script"
pour
en
exécuter
les
instruc7ons
à
la
volée.




Exemples:


o  bash


o  SQL



En
Unix,
le
shell
est
un
interpréteur
de
ligne
de
commande.




                                          


                                         








                                                                   12

BACK
TO
THE
BASICS

Le
langage
assembleur
pour
x86



Sur
la
plupart
des
ordinateurs,
le
processeur
qui
exécute
les
instruc7ons

appar7ent
à
la
famille
x86.


Il
s'agit
de
la
famille
de
processeurs
Intel
IA
32
bits,
basée
sur
le
premier

microprocesseur
de
ce
type
d'architecture:
le
Intel
8086.



Le
langage
assembleur
x86
est
un
jeu
d'instruc7ons
compa7bles
avec
les

processeurs
de
la
famille
x86.







                                           


                                           









                                                                       13

DISASSEMBLING
TIME
!



     Sur
le
programme
précédent:

     

       Visualiser
le
fichier
exécutable
simple_prog

     

     Comment
afficher
le
programme
en
langage
assembleur
?

       Avec
GDB:
          


         
#
gdb
simple_prog

         
(gdb)
list

         
(gdb)
disassemble
main

     

       Avec
objdump

         
#objdump
–M
intel
–D
simple_prog

                                                            14

BACK
TO
THE
BASICS

Notre
programme
en
langage
assembleur
(Linux
2.6.40.3‐0.fc15.i686)



Syntaxe
AT
&
T:






0x080483b4
<+0>:     
push


%ebp




0x080483b5
<+1>:     
mov



%esp,%ebp




0x080483b7
<+3>:     
and




$0xfffffff0,%esp




0x080483ba
<+6>:     
sub




$0x20,%esp




0x080483bd
<+9>:     
movl


$0x0,0x1c(%esp)




0x080483c5
<+17>:    
jmp




0x80483d8
<main+36>




0x080483c7
<+19>:    
movl


$0x80484d0,(%esp)




0x080483ce
<+26>:    
call





0x80482f0
<puts@plt>

                                          




0x080483d3
<+31>:    
addl



$0x1,0x1c(%esp)

                                          




0x080483d8
<+36>:    
cmpl


$0x9,0x1c(%esp)




0x080483dd
<+41>:    
jle







0x80483c7
<main+19>




...


                                                             15

BACK
TO
THE
BASICS

Notre
programme
en
langage
assembleur
(Linux
2.6.40.3‐0.fc15.i686)



Syntaxe
AT
&
T:






0x080483b4
<+0>:     
push


%ebp




0x080483b5
<+1>:     
mov



%esp,%ebp




0x080483b7
<+3>:     
and




$0xfffffff0,%esp




0x080483ba
<+6>:     
sub




$0x20,%esp




0x080483bd
<+9>:     
movl


$0x0,0x1c(%esp)




0x080483c5
<+17>:    
jmp




0x80483d8
<main+36>




0x080483c7
<+19>:    
movl


$0x80484d0,(%esp)




0x080483ce
<+26>:    
call





0x80482f0
<puts@plt>




0x080483d3
<+31>:    
addl



$0x1,0x1c(%esp)




0x080483d8
<+36>:    
cmpl


$0x9,0x1c(%esp)




0x080483dd
<+41>:    
jle







0x80483c7
<main+19>




...


                                                             16

BACK
TO
THE
BASICS

Les
registres
de
l'architecture
x86




   (gdb)
info
registers





 EAX
–
Accumulator
register

























                                                            En
général,
ils
stockent


 ECX
–
Counter
register











































  EDX
–
Data
register
                                        temporairement
des

                                                             variables
pour
le
CPU.


 EBX
–
Base
register

                                                                         


 

                                                                         







ESP
–
Stack
Pointer
























               Enregistre
des
adresses
32‐bits



                                                                         

  


 EBP
–
Base
Pointer











































                                                          
 






                                                                         

  

  ESI
–
Source
Index
                                     
 Pointeurs
u7lisés
quand
des

                                                                         

  

  EDI
–
Des7na7on
Index
                                     données
doivent
être
lues
ou

                                                                         

  
                                                          écrites
à
un
emplacement
donné.

                                                                         

  

  EIP
–
Instruc7on
Pointer
                                  Pointe
à
l'instruc7on
courante
(que

  
                                                          le
processeur
est
en
train
de
lire)

  
                                                                                   17

BACK
TO
THE
BASICS

Notre
programme
en
langage
assembleur
(Linux
2.6.40.3‐0.fc15.i686)





                                                              18

BACK
TO
THE
BASICS

Notre
programme
en
langage
assembleur
(Linux
2.6.40.3‐0.fc15.i686)



Syntaxe
AT
&
T:






0x080483b4
<+0>:          
push


%ebp




0x080483b5
<+1>:          
mov



%esp,%ebp




0x080483b7
<+3>:          
and




$0xfffffff0,%esp




0x080483ba
<+6>:          
sub




$0x20,%esp




0x080483bd
<+9>:          
movl


$0x0,0x1c(%esp)




0x080483c5
<+17>:         
jmp




0x80483d8
<main+36>




0x080483c7
<+19>:         
movl


$0x80484d0,(%esp)




0x080483ce
<+26>:         
call





0x80482f0
<puts@plt>






  Syntaxe:
opera#on
<source>,
<des+na+on>

          







mov
%esp,
%ebp






copie
le
contenu
de
esp
(source)
dans
ebp
(des0na0on)


                                                               19

BACK
TO
THE
BASICS

Notre
programme
en
langage
assembleur
(Linux
2.6.40.3‐0.fc15.i686)




Syntaxe
Intel: 
plus
claire
à
déchiffrer
dans
un
premier
temps






0x080483b4
<+0>:          
push


ebp




0x080483b5
<+1>:          
mov



ebp,esp




0x080483b7
<+3>:          
and




esp,0xfffffff0




0x080483ba
<+6>:          
sub




esp,0x20




0x080483bd
<+9>:          
mov



DWORD
PTR
[esp+0x1c],0x0




0x080483c5
<+17>:         
jmp




0x80483d8
<main+36>




0x080483c7
<+19>:         
mov



DWORD
PTR
[esp],0x80484d0




0x080483ce
<+26>:         
call





0x80482f0
<puts@plt>





  Syntaxe:
opera#on
<des+na+on>,
<source>

         







mov
ebp,
esp

    copie
le
contenu
de
esp
(source)
dans
ebp
(des0na0on)

    
                                                              20

BACK
TO
THE
BASICS

Configurer
GDB
pour
u#liser
la
syntaxe
Intel








  A
chaque
lancement:








$
gdb






(gdb)
set
disassembly‐flavor
intel







  Dans
.gdbinit:






$
echo
"set
disassembly‐flavor
intel"
>
~/.gdbinit



                                          


                                          





                                                          21

BACK
TO
THE
BASICS

Décomposons
un
pe#t
peu
tout
ça...
(code
Linux)

(gdb) disass main
Dump of assembler code for               function main:
 0x080483b4 <+0>:   push                 ebp
 0x080483b5 <+1>:   mov                  ebp,esp
 0x080483b7 <+3>:   and                  esp,0xfffffff0
 0x080483ba <+6>:   sub                  esp,0x20
 0x080483bd <+9>:   mov                  DWORD PTR [esp+0x1c],0x0
 0x080483c5 <+17>: jmp                   0x80483d8 <main+36>


On
sauve
les
infos
!
                           En
image...


                                            

  On
sauve
l'adresse
pointée
esp

   dans
ebp.
                               
                  ebp

  Il
faut
savoir
où
revenir
une
fois

                                                               esp

   fini
le
programme
!


                                                                      22

BACK
TO
THE
BASICS

Décomposons
un
pe#t
peu
tout
ça...

(gdb) disass main
Dump of assembler code for        function main:
 0x080483b4 <+0>:   push          ebp
 0x080483b5 <+1>:   mov           ebp,esp
 0x080483b7 <+3>:   and           esp,0xfffffff0
 0x080483ba <+6>:   sub           esp,0x20
 0x080483bd <+9>:   mov           DWORD PTR [esp+0x1c],0x0
 0x080483c5 <+17>: jmp            0x80483d8 <main+36>


Alloca#on
de
mémoire



  On
soustraire
0x20
à
esp,
et
on
                          

   enregistre
la
valeur
dans
esp

  On
met
la
valeur
esp+0x1c
à
0:
             


esp

   déclara7on
de
la
variable

i

  On
saute
à
l'instruc7on
<main+36>
           


i
    +0x1c

                                        +
               23

BACK
TO
THE
BASICS

Décomposons
un
pe#t
peu
tout
ça...

    0x080483bd   <+9>: mov           DWORD   PTR [esp+0x1c],0x0
    0x080483c5   <+17>:              jmp      0x80483d8 <main+36>
    0x080483c7   <+19>:              mov      DWORD PTR [esp],0x80484d0
    0x080483ce   <+26>:              call     0x80482f0 <puts@plt>
    0x080483d3   <+31>:              add      DWORD PTR [esp+0x1c],0x1
    0x080483d8   <+36>:              cmp      DWORD PTR [esp+0x1c],0x9
    0x080483dd   <+41>:              jle      0x80483c7 <main+19>
    0x080483df   <+43>:              mov      eax,0x0
    0x080483e4   <+48>:              leave

La
boucle
for



  Comparaison
dans
la
boucle
for





                                                              24

BACK
TO
THE
BASICS

Décomposons
un
pe#t
peu
tout
ça...

   0x080483bd     <+9>: mov       DWORD   PTR [esp+0x1c],0x0
   0x080483c5     <+17>:          jmp      0x80483d8 <main+36>
   0x080483c7     <+19>:          mov      DWORD PTR [esp],0x80484d0
   0x080483ce     <+26>:          call     0x80482f0 <puts@plt>
   0x080483d3     <+31>:          add      DWORD PTR [esp+0x1c],0x1
   0x080483d8     <+36>:          cmp      DWORD PTR [esp+0x1c],0x9
   0x080483dd     <+41>:          jle      0x80483c7 <main+19>
   0x080483df     <+43>:          mov      eax,0x0
   0x080483e4     <+48>:          leave

Exécu#on
de
la
boucle
for



  Appel
de
la
fonc7on
prinƒ()

  On
incrémente
i
pour
le
prochain

   tour.



                                                           25

BACK
TO
THE
BASICS

Décomposons
un
pe#t
peu
tout
ça...

   0x080483c7    <+19>:          mov     DWORD PTR   [esp],0x80484d0
   0x080483ce    <+26>:          call    0x80482f0   <puts@plt>
   0x080483d3    <+31>:          add     DWORD PTR   [esp+0x1c],0x1
   0x080483d8    <+36>:          cmp     DWORD PTR   [esp+0x1c],0x9
   0x080483dd    <+41>:          jle     0x80483c7   <main+19>
   0x080483df    <+43>:          mov     eax,0x0
   0x080483e4    <+48>:          leave
   0x080483e5    <+49>:          ret


Sor#e
du
programme



  leave:
mov
esp,
ebp

  ret:
"return
from
procedure",
à

   une
adresse
indiquée
en
haut
de

   la
pile


                                                           26

GDB
TIME
!



     On
va
suivre
le
déroulement
pas
à
pas
de
simple_prog

     

       But:
comprendre
le
rôle
de
certains
registres

     





                                                             27

GDB
TIME
!


    •  List
fonc+on
:
affiche
les
lignes
de
code
du
programme


    •  break
n
:
pose
un
point
d'arrêt
à
la
ligne
n
ou
à
la
fonc7on
n.

    •  run
:
exécute
le
programme
en
en7er
ou
jusqu'au
prochain
break


    •  step
:
exécute
l'instruc7on
suivante
(mode
pas‐à‐pas)

    





nex#
:
exécute
l'instruc7on
courante

                                        info


    •  info
r
ou
info
register:
affiche
l'état
des
registres
d'instruc7ons

    •  print
exp:
affiche
la
valeur
de
exp

    •  info
addr
exp:
affiche
l'addresse
de
exp

    

    

                                                                    28

BACK
TO
THE
BASICS

La
commande
examine




  Intérêt:
examiner
l'état
de
la
mémoire



  Syntaxe
de
la
commande:
x/format
addr

       o  o
:
en
octal

       o  x
:
en
hexadécimal

       o  u
:
unsigned
(base
décimal
standard)

       o  t
:
en
binaire


       




       



                                                  29

BACK
TO
THE
BASICS

Suivre
l'état
de
la
mémoire
de
EIP
avec
x




  Le
 registre
 EIP
 (Instruc7on
 Pointer)
 con7ent
 les
 adresses
 mémoire
 qui

   pointent
vers
les
instruc7ons
du
programme
en
cours
d'exécu7on.



(gdb)
i
r
eip
     
         
#
raccourci
pour
info
register
eip

(gdb)
x/x
$eip
 
            
#
$eip
désigne
l'adresse
contenue
dans
eip



  On
peut
afficher
plusieurs
"mots"
(un
mot
=
4
octets):

(gdb)
x/2x
$eip



  L'op7on
i
permet
d'afficher
la
mémoire
comme
une
instruc7on
de
langage

   assembleur:


(gdb)
x/i
$eip





                                                                     30

BACK
TO
THE
BASICS

Suivre
l'état
de
la
mémoire
de
EIP
avec
x

 

  On
peut
moduler
la
taille
des
unités
d'adresses
affichées
(par
défaut,
un

   mot)
:

           o  b
:
1
octet

           o  h
:
2
octets
(un
demi‐mot
ou
halfword
ou
short)

           o  w
:
1
mot
(word)

           o  g
:
8
octets
(giant
word)


A/en7on
!
Un
mot
peut
aussi
désigner
2
octets.


Un
double
word
ou
DWORD
désigne
alors
4
octets.



(gdb)
x/8xb
$eip

(gdb)
x/8xw
$eip


           




                                                                 31

BACK
TO
THE
BASICS

Pe#t
Indien
ou
Grand
Indien



(gdb)
x/8xb
$eip

0x1fc3
<main+13>:
0xc7


0x45



0xf4



0x00



0x00



0x00



0x00



0xeb



(gdb)
x/xw
$eip

0x1fc3
<main+13>:
0x00f445c7


  Sur
 les
 processeurs
 x86,
 les
 valeurs
 sont
 stockées
 en
 lible‐endian:
 les

      octets
de
poids
faible
sont
stockés
en
premier.







(
poids
faible
==
de
puissances
les
plus
pe7tes
dans
la
base
de
nota7on
)




/!
Sur
le
réseau,
c'est
le
contraire:
valeurs
stockées
en
big‐endian
!








                                                                        32

BACK
TO
THE
BASICS

Déclara#on
de
la
variable
i
















                               33

BACK
TO
THE
BASICS

Chaîne
ASCII



0x080483c7 <+19>: mov    DWORD PTR [esp],0x80484d0



(gdb)
x/8xb
0x80484d0

(gdb)
x/6ub
0x80484d0



  Table
ASCII





                                             34

BACK
TO
THE
BASICS

                      35

Chaîne
ASCII

BACK
TO
THE
BASICS

Chaîne
ASCII



0x080483c7 <+19>: mov              DWORD PTR [esp],0x80484d0

(gdb)
x/8xb
0x80484d0

(gdb)
x/6ub
0x80484d0



  Table
ASCII


  Directement
avec
GDB:


(gdb)
x/6cb
0x80484d0    
#
regarde
la
correspondance
octet
par
octet

(gdb)
x/s

0x80484d0     
#
affiche
directement
la
chaîne
de
caractères

         





                                                                36

BACK
TO
THE
BASICS

Un
programme
simple
en
C


#include <stdio.h>

int main(){
      int i;
      for (i = 0; i < 10; i++){
            printf("Hello world !n");
      }
      return 0;
}


La
librairie
stdio.h
                      Accéder
au
code
de
prind()
?


                                           

Standart
Input/Output
library
                 Où
est
le
code
de
prinƒ()
?

                                           
   Comment
y
accéder
?

  /usr/include/stdio.h

Con7ent
le
prototype
de
la
fonc7on




















prinƒ()


                                                                      37

BACK
TO
THE
BASICS

    Trouver
le
code
source
de
prind()





Le
code
de
prinƒ()
se
trouve
dans
des
paquets
précompilés
de
la
libc.



  Il
faut
aller
regarder
par
exemple
les
sources
de
la
glibc.

o  Télécharger
les
sources:
h/p://‡p.gnu.org/gnu/glibc/

o  $
apt‐get
source
glibc‐devel


  Le
code
devient
rapidement
complexe
et
long.







                                         


                                         







           

                                                      38

BACK
TO
THE
BASICS

Trouver
le
code
source
de
prind()





Le
code
de
prinƒ()
se
trouve
dans
des
paquets
précompilés
de
la
libc.



  Il
faut
aller
regarder
par
exemple
les
sources
de
la
glibc.

o  Télécharger
les
sources:
h/p://‡p.gnu.org/gnu/glibc/

o  $
apt‐get
source
glibc‐devel


Le
code
devient
rapidement
complexe
et
long.




  Une
alterna7ve
est
de
regarder
dans
le
code
de
la
dietlibc.

o  h/p://dietlibc.sourcearchive.com/



                                         


                                         








                                                                   39

BACK
TO
THE
BASICS

Retour
sur
quelques
commandes
assembleur





Le
jeu
d'instruc7on
assembleur
pour
x86
a
évolué
avec
le
temps
et
les

architectures.



Instruc7ons
ini7ales
pour
les
8086/8088:
une
centaine
d'instruc7on.





not      
and    
or      
xor     
neg    


push 
pop        
mov     


jmp      
cmp
 
jle       


add      
sub    
mul     


inc      
dec    


lea




                                       



                                       











                                                                 40

CONCEPTS
DE
C
A
TRAVERS
LE
SCOPE
DU
DEBOGGUEUR





                                                  41

CODING
TIME
–
Chaînes
de
caractères



     Ecrire
un
programme
qui
créé
une
chaîne
de
caractère
et
qui
















        l'
imprime
à
l'écran.

     

       Ce/e
chaîne
devra
être
construite
caractère
par
caractère.

       


     
                             info

     Puis
avec
GDB,
désassemblez
le
code.





                                                                     42

CODING
TIME
–
Chaînes
de
caractères



     Ecrire
un
programme
qui
créé
une
chaîne
de
caractère
et
qui
















        l'
imprime
à
l'écran.

     

       Ce/e
chaîne
devra
être
construite
caractère
par
caractère.

       


     
                             info

     Puis
avec
GDB,
désassemblez
le
code.

     

     

       Faire
de
même
en
u7lisant
strcpy().




                                                                     43

CONCEPTS
DE
C
A
TRAVERS
LE
SCOPE
DU
DEBOGGUEUR

Tailles
de
certains
types
de
variables







  Signed
int
:
en7ers
posi7fs
et
néga7fs

  Unsigned
int
:
seulement
des
en7ers
posi7fs


Sur
un
processeur
x86_32bits,
il
y
a
2^32
combinaisons
possibles
pour
un

unsigned
int
(4
294
967
295
possibilités).

Pour
un
signed
int
:
entre
‐2
147
483
648
à
2
147
483
647.





  La
taille
d'un
type
dépend
du
type
d'architecture.


                                         



                                        






                                                                 44

CONCEPTS
DE
C
A
TRAVERS
LE
SCOPE
DU
DEBOGGUEUR

Les
pointeurs





  EIP,
l'Instruc7on
Pointer,
est
un
pointeur
qui
pointe
vers
l'instruc7on
en

   cours
car
il
con7ent
son
adresse
mémoire.


  On
ne
peut
pas
bouger
"réellement"
des
adresses
de
mémoires

      physiques.







On
doit
donc
copier
l'informa7on
stockée
à
cet
emplacement
mémoire.







C'est
coûteux
:
gros
chunks
de
mémoire
à
allouer/copier.




                                                    data




                 data



                                                   data




                                                                    45

CONCEPTS
DE
C
A
TRAVERS
LE
SCOPE
DU
DEBOGGUEUR

 Les
pointeurs

 

 

 La
solu7on
:
les
pointeurs.

 

   Au
lieu
de
copier
des
gros
morceaux
de
mémoire,
on
u7lise
l'adresse
du

     début
du
bloc
de
mémoire
en
ques7on.

 

 

 

 

 

                                          Pointeur
vers
addrDébut


 

                  data

                                                       data

addrDébut
                        addrDébut


 
                                                                46

CONCEPTS
DE
C
A
TRAVERS
LE
SCOPE
DU
DEBOGGUEUR

Les
pointeurs



Un
pointeur
est
défini
comme
quelque
chose
qui
pointe
vers
une
donnée

d'un
certain
type:



int
*ptr;
       
       
#
ptr
pointe
vers
une
donnée
de
type
int.



















                                                              47

CONCEPTS
DE
C
A
TRAVERS
LE
SCOPE
DU
DEBOGGUEUR

Les
pointeurs



Un
pointeur
est
défini
comme
quelque
chose
qui
pointe
vers
une
donnée

d'un
certain
type:



int
*ptr;
        
      
#
ptr
pointe
vers
une
donnée
de
type
int.






Comment
voir
les
données
qui
sont
enregistrées
dans
le
pointeur
lui‐même
?



  opérateur
&

(gdb)
print
pointer      
         
#print
la
valeur
du
pointeur
(une
adresse)

(gdb)
print
&pointer     
         
#print
l'adresse
du
pointeur



  déréférencement
*

(gdb)
print
*pointer
    
         
#print
la
valeur
des
données
présentes

         
        
      
         
à
l'adresse
contenue
dans
le
pointeur.

                                                                   48

CONCEPTS
DE
C
A
TRAVERS
LE
SCOPE
DU
DEBOGGUEUR

Typecas#ng







Typecas7ng
:
changement
temporaire
du
type
d'une
variable,
quelque
soit

le
type
avec
lequel
a
été
défini
ce/e
variable.



Syntaxe
:
(typecast_data_type)
variable














                                                               49

CODING
TIME
!



     Ecrire
en
C
un
programme
qui:

     

       Définit
2
tableaux
de
5
chiffres
et
5
le/res;

       Affiche
le
contenu
des
deux
tableaux
(on
définira
un
pointeur

        pour
afficher
le
contenu
dans
une
boucle
for).


     





                                                              50

GDB
TIME
!



     Afficher
l'adresse
du
premier
élément
de
chacun
des
tableaux.

     

     Deviner
les
adresses
des
éléments
suivants
?

     

     Vérifier
le
résultat
avec
GDB.



     





                                                             51

CONCEPTS
DE
C
A
TRAVERS
LE
SCOPE
DU
DEBOGGUEUR

Les
types
avec
les
pointeurs



  Le
format
%d
est
équivalent
à
0x%08x
pour
afficher
des
adresses
mémoire.







(donc
pra7que
pour
afficher
les
valeurs
de
pointeurs)



On
 va
 jouer
 un
 peu
 avec
 les
 types
 de
 pointeurs:
 exécuter
 le
 programme

pointer_types2.c



Corriger
le
programme
!














                                                                    52

CONCEPTS
DE
C
A
TRAVERS
LE
SCOPE
DU
DEBOGGUEUR

Les
types
avec
les
pointeurs



  Le
format
%d
est
équivalent
à
0x%08x
pour
afficher
des
adresses
mémoire.







(donc
pra7que
pour
afficher
les
valeurs
de
pointeurs)



On
 va
 jouer
 un
 peu
 avec
 les
 types
 de
 pointeurs:
 exécuter
 le
 programme

pointer_types2.c



Corriger
le
programme
!



2
autres
exmples
avec
pointer_types4.c
et
pointer_types5.c











                                                                    53

CONCEPTS
DE
C
A
TRAVERS
LE
SCOPE
DU
DEBOGGUEUR

Passez
des
arguments
en
ligne
de
commande



  Le
format
%d
est
équivalent
à
0x%08x
pour
afficher
des
adresses
mémoire.







(donc
pra7que
pour
afficher
les
valeurs
de
pointeurs)



On
 va
 jouer
 un
 peu
 avec
 les
 types
 de
 pointeurs:
 exécuter
 le
 programme

pointer_types2.c



Corriger
le
programme
!



2
autres
exmples
avec
pointer_types4.c
et
pointer_types5.c











                                                                    54

GDB
TIME
!



     On
a
créé
un
programme
buggué:
debug.c

     

       But
du
jeu:
trouver
où
est
le
bug
avec
GDB
et
uniquement
avec

        GDB.

     

     NE
PAS
UTILISER
LIST
!
On
ne
doit
pas
voir
le
code
du

                                     info

       programme
!

     





                                                              55

GDB
TIME
!



    •  display
exp
:
équivaut
à
un
print
exp
effectué
chaque
fois
que
le

       programme
stoppe.

    •  delete
display
dnums
:
annule
l'affichage
des
variables
de
numéro

       dnums.

    

    •  show
values
n
:
afficher
les
n
dernières
valeurs
affichées

                                      info


    •  wha#s
exp
:
donne
le
type
d'une
variable

    •  info
address
exp:
donne
l'adresse
de
exp

    

    


                                                               56

MEMORY
SEGMENTATION





                       57

BACK
TO
THE
BASICS

Notre
programme
en
langage
assembleur
(Darwin
Kernel
Version
9.8.0)



Syntaxe
AT
&
T:



0x00001•6
<main+0>:     
push


%ebp

0x00001•7
<main+1>:     
mov



%esp,%ebp

0x00001•9
<main+3>:     
push


%ebx

0x00001•a
<main+4>:     
sub




$0x24,%esp

0x00001•d
<main+7>:     
call




0x1fc2
<main+12>

0x00001fc2
<main+12>:   
pop



%ebx

0x00001fc3
<main+13>:   
movl


$0x0,‐0xc(%ebp)

0x00001fca
<main+20>:   
jmp




0x1fdf
<main+41>

                                          


0x00001fcc
<main+22>:   
lea






0x2e(%ebx),%eax

                                          


0x00001fd2
<main+28>:   
mov



%eax,(%esp)

0x00001fd5
<main+31>:   
call





0x3005
<dyld_stub_puts>

...


                                                             58

BACK
TO
THE
BASICS

Avec
un
compilateur/processeur
différent:

(gdb) disass main
Dump of assembler code for function main:
0x00001fb6 <main+0>:       push   %ebp
0x00001fb7 <main+1>:       mov    %esp,%ebp
0x00001fb9 <main+3>:       push   %ebx
0x00001fba <main+4>:       sub    $0x24,%esp
0x00001fbd <main+7>:       call   0x1fc2 <main+12>
0x00001fc2 <main+12>:      pop    %ebx
0x00001fc3 <main+13>:      movl   $0x0,-0xc(%ebp)

On
sauve
les
infos
!
                        En
image...



  On
sauve
l'adresse
pointée
par
       
       ebp

   ebp
dans
la
stack.
                   

                                                  esp

  Il
faut
savoir
où
revenir
une
fois
                            ebx

   fini
le
programme
!

                                                                  ebp


                                                            59

                                                                  esp

BACK
TO
THE
BASICS

Décomposons
un
pe#t
peu
tout
ça...

(gdb) disass main
Dump of assembler code for function main:
0x00001fb6 <main+0>:       push   %ebp
0x00001fb7 <main+1>:       mov    %esp,%ebp
0x00001fb9 <main+3>:       push   %ebx
0x00001fba <main+4>:       sub    $0x24,%esp
0x00001fbd <main+7>:       call   0x1fc2 <main+12>
0x00001fc2 <main+12>:      pop    %ebx
0x00001fc3 <main+13>:      movl   $0x0,-0xc(%ebp)

Alloca#on
de
mémoire
                    Remarques



  On
alloue
de
la
mémoire
             Ici,
on
fait
intervenir
un
registre

  On
appelle
l'instruc7on
<main+12>
    ebx.
A
priori,
difficile
de
voir
à

  On
pop
ebx.
                          quoi
cela
sert.

                                        $
exp
:
valeur
exp

                                        %
reg
:

adresse
du
registre
reg

                                      
                            60

BACK
TO
THE
BASICS

Décomposons
un
pe#t
peu
tout
ça...

0x00001fc3    <main+13>:        movl     $0x0,-0xc(%ebp)
0x00001fca    <main+20>:        jmp      0x1fdf <main+41>
0x00001fcc    <main+22>:        lea      0x2e(%ebx),%eax
0x00001fd2    <main+28>:        mov      %eax,(%esp)
0x00001fd5    <main+31>:        call     0x3005 <dyld_stub_puts>
0x00001fda    <main+36>:        lea      -0xc(%ebp),%eax
0x00001fdd    <main+39>:        incl     (%eax)
0x00001fdf    <main+41>:        cmpl     $0x9,-0xc(%ebp)
0x00001fe3    <main+45>:        jle      0x1fcc <main+22>

Ques#on
!
                        Déclara#on
de
la
variable
i



Qu'est‐ce
que
‐0xc(%ebp)
?
         On
met
4
octets
à
0,
12
cases

                                     mémoire
au
dessus
de
ebp





                                                                 61

BACK
TO
THE
BASICS

Décomposons
un
pe#t
peu
tout
ça...

0x00001fc3       <main+13>:          movl     $0x0,-0xc(%ebp)
0x00001fca       <main+20>:          jmp      0x1fdf <main+41>
0x00001fcc       <main+22>:          lea      0x2e(%ebx),%eax
0x00001fd2       <main+28>:          mov      %eax,(%esp)
0x00001fd5       <main+31>:          call     0x3005 <dyld_stub_puts>
0x00001fda       <main+36>:          lea      -0xc(%ebp),%eax
0x00001fdd       <main+39>:          incl     (%eax)
0x00001fdf       <main+41>:          cmpl     $0x9,-0xc(%ebp)
0x00001fe3       <main+45>:          jle      0x1fcc <main+22>

La
boucle
for
                              Remarque



  Comparaison
dans
la
boucle
for
      On
u7lise
eax
ou
ebp
au
lieu
du
stack

                                        pointer.





                                                                  62

BACK
TO
THE
BASICS

Décomposons
un
pe#t
peu
tout
ça...

0x00001fc3    <main+13>:            movl     $0x0,-0xc(%ebp)
0x00001fca    <main+20>:            jmp      0x1fdf <main+41>
0x00001fcc    <main+22>:            lea      0x2e(%ebx),%eax
0x00001fd2    <main+28>:            mov      %eax,(%esp)
0x00001fd5    <main+31>:            call     0x3005 <dyld_stub_puts>
0x00001fda    <main+36>:            lea      -0xc(%ebp),%eax
0x00001fdd    <main+39>:            incl     (%eax)
0x00001fdf    <main+41>:            cmpl     $0x9,-0xc(%ebp)
0x00001fe3    <main+45>:            jle      0x1fcc <main+22>

Exécu#on
de
la
boucle
for
                 Remarque



  String
"hello
world
!
n"

contenue

   à
l'adresse
0x2e(%ebx)

  Appel
de
la
fonc7on
prinƒ()

  On
incrémente
i
pour
le
prochain

   tour.

                                                             63

BACK
TO
THE
BASICS

Décomposons
un
pe#t
peu
tout
ça...

0x00001fe5     <main+47>:           mov     $0x0,%eax
0x00001fea     <main+52>:           add     $0x24,%esp
0x00001fed     <main+55>:           pop     %ebx
0x00001fee     <main+56>:           leave
0x00001fef     <main+57>:           ret




Fin
et
sorite
du
programme
             Remarque



On
replace
le
stack
pointer
à
sa

posi7on
ini7ale.

On
réini7alise
eax
à
0.



                                                         64


Mais conteúdo relacionado

Mais procurados

cours Algorithmique SMP-SMC s2 by coursedu.blogspot.com
cours Algorithmique SMP-SMC s2 by coursedu.blogspot.comcours Algorithmique SMP-SMC s2 by coursedu.blogspot.com
cours Algorithmique SMP-SMC s2 by coursedu.blogspot.comcoursedu
 
Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++Fabio Hernandez
 
Chapitre ii architecture interne des processeurs
Chapitre ii architecture interne des processeursChapitre ii architecture interne des processeurs
Chapitre ii architecture interne des processeursSana Aroussi
 
Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Emeric Tapachès
 
Chapitre i architectures des processeurs récents
Chapitre i architectures des processeurs récentsChapitre i architectures des processeurs récents
Chapitre i architectures des processeurs récentsSana Aroussi
 
Base des systèmes à microprocesseur
Base des systèmes à microprocesseurBase des systèmes à microprocesseur
Base des systèmes à microprocesseurPeronnin Eric
 
Réalisation d'un compilateur de mini langage - Khawarizmi
Réalisation d'un compilateur  de mini langage - KhawarizmiRéalisation d'un compilateur  de mini langage - Khawarizmi
Réalisation d'un compilateur de mini langage - KhawarizmiBachir Benyammi
 
Theme1 (1)
Theme1 (1)Theme1 (1)
Theme1 (1)salmazen
 
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Fabio Hernandez
 
Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++Fabio Hernandez
 
Architecture des ordinateurs : microprocesseur
Architecture des ordinateurs : microprocesseurArchitecture des ordinateurs : microprocesseur
Architecture des ordinateurs : microprocesseurAbdoulaye Dieng
 
cour de compilation
cour de compilation cour de compilation
cour de compilation Ens Kouba
 
Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Fabio Hernandez
 

Mais procurados (16)

cours Algorithmique SMP-SMC s2 by coursedu.blogspot.com
cours Algorithmique SMP-SMC s2 by coursedu.blogspot.comcours Algorithmique SMP-SMC s2 by coursedu.blogspot.com
cours Algorithmique SMP-SMC s2 by coursedu.blogspot.com
 
Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++Partie 4: Fonctions - Programmation orientée objet en C++
Partie 4: Fonctions - Programmation orientée objet en C++
 
Chapitre ii architecture interne des processeurs
Chapitre ii architecture interne des processeursChapitre ii architecture interne des processeurs
Chapitre ii architecture interne des processeurs
 
Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2
 
Td pascal tdD
Td pascal tdDTd pascal tdD
Td pascal tdD
 
Chapitre i architectures des processeurs récents
Chapitre i architectures des processeurs récentsChapitre i architectures des processeurs récents
Chapitre i architectures des processeurs récents
 
Base des systèmes à microprocesseur
Base des systèmes à microprocesseurBase des systèmes à microprocesseur
Base des systèmes à microprocesseur
 
Réalisation d'un compilateur de mini langage - Khawarizmi
Réalisation d'un compilateur  de mini langage - KhawarizmiRéalisation d'un compilateur  de mini langage - Khawarizmi
Réalisation d'un compilateur de mini langage - Khawarizmi
 
Theme1 (1)
Theme1 (1)Theme1 (1)
Theme1 (1)
 
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++Partie 14: Entrée/Sortie — Programmation orientée objet en C++
Partie 14: Entrée/Sortie — Programmation orientée objet en C++
 
Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++Partie 1: Notions de base — Programmation orientée objet en C++
Partie 1: Notions de base — Programmation orientée objet en C++
 
Développement informatique : Programmation concurrente
Développement informatique : Programmation concurrenteDéveloppement informatique : Programmation concurrente
Développement informatique : Programmation concurrente
 
Architecture des ordinateurs : microprocesseur
Architecture des ordinateurs : microprocesseurArchitecture des ordinateurs : microprocesseur
Architecture des ordinateurs : microprocesseur
 
Formation python 3
Formation python 3Formation python 3
Formation python 3
 
cour de compilation
cour de compilation cour de compilation
cour de compilation
 
Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++Partie 10: Classes Génériques — Programmation orientée objet en C++
Partie 10: Classes Génériques — Programmation orientée objet en C++
 

Destaque

Destaque (20)

Compu training replay_ece
Compu training replay_eceCompu training replay_ece
Compu training replay_ece
 
Los poemas
Los poemasLos poemas
Los poemas
 
2012 01-02 notasegw
2012 01-02 notasegw2012 01-02 notasegw
2012 01-02 notasegw
 
01.12.12 marqueting mk mix introd.producte
01.12.12 marqueting mk mix introd.producte01.12.12 marqueting mk mix introd.producte
01.12.12 marqueting mk mix introd.producte
 
Le March
Le MarchLe March
Le March
 
Potasio
PotasioPotasio
Potasio
 
Nicole caratozolo lesson plan questions
Nicole caratozolo lesson plan questionsNicole caratozolo lesson plan questions
Nicole caratozolo lesson plan questions
 
Estrategias de socialización
Estrategias de socializaciónEstrategias de socialización
Estrategias de socialización
 
Recruiting presentation fr
Recruiting presentation frRecruiting presentation fr
Recruiting presentation fr
 
Pp2
Pp2Pp2
Pp2
 
Sfpl
SfplSfpl
Sfpl
 
Destination Amnéville
Destination AmnévilleDestination Amnéville
Destination Amnéville
 
FRENCH:EGYPT
FRENCH:EGYPTFRENCH:EGYPT
FRENCH:EGYPT
 
Fotos de la revolución china
Fotos de la revolución chinaFotos de la revolución china
Fotos de la revolución china
 
Cours de Pédopsychiatrie - Université Notre Dame d'Haïti - mai 2015
Cours de Pédopsychiatrie - Université Notre Dame d'Haïti - mai 2015Cours de Pédopsychiatrie - Université Notre Dame d'Haïti - mai 2015
Cours de Pédopsychiatrie - Université Notre Dame d'Haïti - mai 2015
 
Les produits du marché couvert
Les produits du marché couvertLes produits du marché couvert
Les produits du marché couvert
 
6èmes rencontres régionales Cyber-base - clé USB
6èmes rencontres régionales Cyber-base - clé USB6èmes rencontres régionales Cyber-base - clé USB
6èmes rencontres régionales Cyber-base - clé USB
 
2012 02-04 complementario
2012 02-04 complementario2012 02-04 complementario
2012 02-04 complementario
 
vcbn
vcbnvcbn
vcbn
 
Unit 3 pqt
Unit 3 pqtUnit 3 pqt
Unit 3 pqt
 

Semelhante a Dans les entrailles du langage C

Assembleur i8086
Assembleur i8086Assembleur i8086
Assembleur i8086ahmedyes
 
Chapitre 1 (algorithme)
Chapitre 1 (algorithme)Chapitre 1 (algorithme)
Chapitre 1 (algorithme)mahbouba
 
0419-langages-de-programmation-et-compilation.pdf
0419-langages-de-programmation-et-compilation.pdf0419-langages-de-programmation-et-compilation.pdf
0419-langages-de-programmation-et-compilation.pdfFATI432465
 
Pic 16f877 ..
Pic 16f877 ..Pic 16f877 ..
Pic 16f877 ..sunprass
 
Programmation-en-C-ESIITECH-2023-2024-bis.pptx
Programmation-en-C-ESIITECH-2023-2024-bis.pptxProgrammation-en-C-ESIITECH-2023-2024-bis.pptx
Programmation-en-C-ESIITECH-2023-2024-bis.pptxOlyvierNzighou1
 
Programmation-en-C-ESIITECH-2023-2024.pptx
Programmation-en-C-ESIITECH-2023-2024.pptxProgrammation-en-C-ESIITECH-2023-2024.pptx
Programmation-en-C-ESIITECH-2023-2024.pptxOlyvierNzighou1
 
Cours de PIC Généralités.pdf
Cours de PIC Généralités.pdfCours de PIC Généralités.pdf
Cours de PIC Généralités.pdfAliRami3
 
DSP FPGA.pdf
DSP FPGA.pdfDSP FPGA.pdf
DSP FPGA.pdfHouBou3
 
Cours_C_for_Etudiant.pdf
Cours_C_for_Etudiant.pdfCours_C_for_Etudiant.pdf
Cours_C_for_Etudiant.pdfHailisara
 
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...Pôle Systematic Paris-Region
 
Introduction a la compilation Aperçu de la compilation / Assembleur MIPS - C1
Introduction a la compilation  Aperçu de la compilation / Assembleur MIPS - C1Introduction a la compilation  Aperçu de la compilation / Assembleur MIPS - C1
Introduction a la compilation Aperçu de la compilation / Assembleur MIPS - C1Beligh HAMDI
 
cours-gratuit.com--system1id048.pdf
cours-gratuit.com--system1id048.pdfcours-gratuit.com--system1id048.pdf
cours-gratuit.com--system1id048.pdfKamalZeghdar
 
Cours Systemes embarques.pptx
Cours Systemes embarques.pptxCours Systemes embarques.pptx
Cours Systemes embarques.pptxSihemNasri3
 
Chapitre1.ppt-------------------------------
Chapitre1.ppt-------------------------------Chapitre1.ppt-------------------------------
Chapitre1.ppt-------------------------------NasriMohsen2
 
Le langage C.pdf
Le langage C.pdfLe langage C.pdf
Le langage C.pdfNoamHaythem
 
Altera nios ii embedded evaluation kit
Altera nios ii embedded evaluation kitAltera nios ii embedded evaluation kit
Altera nios ii embedded evaluation kitWassim Smati
 
Altera nios ii embedded evaluation kit
Altera nios ii embedded evaluation kitAltera nios ii embedded evaluation kit
Altera nios ii embedded evaluation kitWassim Smati
 

Semelhante a Dans les entrailles du langage C (20)

Assembleur i8086
Assembleur i8086Assembleur i8086
Assembleur i8086
 
Chapitre 1 (algorithme)
Chapitre 1 (algorithme)Chapitre 1 (algorithme)
Chapitre 1 (algorithme)
 
0419-langages-de-programmation-et-compilation.pdf
0419-langages-de-programmation-et-compilation.pdf0419-langages-de-programmation-et-compilation.pdf
0419-langages-de-programmation-et-compilation.pdf
 
Pic 16f877 ..
Pic 16f877 ..Pic 16f877 ..
Pic 16f877 ..
 
Programmation-en-C-ESIITECH-2023-2024-bis.pptx
Programmation-en-C-ESIITECH-2023-2024-bis.pptxProgrammation-en-C-ESIITECH-2023-2024-bis.pptx
Programmation-en-C-ESIITECH-2023-2024-bis.pptx
 
Programmation-en-C-ESIITECH-2023-2024.pptx
Programmation-en-C-ESIITECH-2023-2024.pptxProgrammation-en-C-ESIITECH-2023-2024.pptx
Programmation-en-C-ESIITECH-2023-2024.pptx
 
Cours de PIC Généralités.pdf
Cours de PIC Généralités.pdfCours de PIC Généralités.pdf
Cours de PIC Généralités.pdf
 
DSP FPGA.pdf
DSP FPGA.pdfDSP FPGA.pdf
DSP FPGA.pdf
 
Cours_C_for_Etudiant.pdf
Cours_C_for_Etudiant.pdfCours_C_for_Etudiant.pdf
Cours_C_for_Etudiant.pdf
 
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
 
Introduction a la compilation Aperçu de la compilation / Assembleur MIPS - C1
Introduction a la compilation  Aperçu de la compilation / Assembleur MIPS - C1Introduction a la compilation  Aperçu de la compilation / Assembleur MIPS - C1
Introduction a la compilation Aperçu de la compilation / Assembleur MIPS - C1
 
cours-gratuit.com--system1id048.pdf
cours-gratuit.com--system1id048.pdfcours-gratuit.com--system1id048.pdf
cours-gratuit.com--system1id048.pdf
 
Cours pics16 f877
Cours pics16 f877Cours pics16 f877
Cours pics16 f877
 
Cours Systemes embarques.pptx
Cours Systemes embarques.pptxCours Systemes embarques.pptx
Cours Systemes embarques.pptx
 
Chapitre1.ppt-------------------------------
Chapitre1.ppt-------------------------------Chapitre1.ppt-------------------------------
Chapitre1.ppt-------------------------------
 
Le langage C.pdf
Le langage C.pdfLe langage C.pdf
Le langage C.pdf
 
Chapitre3 prog dsplf3
Chapitre3 prog dsplf3Chapitre3 prog dsplf3
Chapitre3 prog dsplf3
 
Microcontrôleur
MicrocontrôleurMicrocontrôleur
Microcontrôleur
 
Altera nios ii embedded evaluation kit
Altera nios ii embedded evaluation kitAltera nios ii embedded evaluation kit
Altera nios ii embedded evaluation kit
 
Altera nios ii embedded evaluation kit
Altera nios ii embedded evaluation kitAltera nios ii embedded evaluation kit
Altera nios ii embedded evaluation kit
 

Dans les entrailles du langage C