Archief - De topics van lang geleden

Debug analyze

05-11-2006, 13:06 door Anoniem, 6 reacties
Hallo allemaal!,
Ik ben bezig beter onder de knie aan het krijgen omstraks de programeer
taal c beter onder de knie te krijgen om veiliger software te schrijven.
Tijdens debuggen stoote ik op een paar kleine puntjes die nog niet echt
helder zijn.

Ik heb gewoon een programma een simpel programma geschreven als :

#include <stdio.h>
Int main(){
const char *msg = "String test";
printf("%sn",);
}

Dit ben ik gaan debuggen onder onder gdb.
(gdb)break main
break point 1 at 0x8048434a
(gdb) r
Starting program :/home/c/string

breakpoint 1,0x804834a in main()
(gdb) disas main
0x8048344 <main>: push %ebp
0x8048345 <main+1>: mov %esp, %ebp
0x8048347 <main+3>: sub $0x8,%esp
0x804834a <main+6>: and $0xffffff0, %esp
0x804834d <main+9>: mov $0x0, %eax
0x8048342 <main+14>: sub %eax,%esp
0x8048354 <main+16>: movl $0x8048268,0xffffffc(%ebp)
0x804835b <main+23>: sub $0x8,%esp
0x804835e <main+26>: pushl 0xfffffc(%ebp)
0x8048361 <main+29>: push $0x8048440
0x8048366 <main+34>: call 0x8048268 <printf>
0x804836b <main+39>: $0x10,%esp
0x804836e <main+42>: leave
0x8048836f <main+43>: ret
End of assembler dump.

Toen ben ik gaan kijken wat het eip adress was van het programma op de
stack maar begrip niet waarom het is opgesplits in 2 main's.Waneer ik
dan onder (gdb) bt in type geeft die het volgende.

(gdb) bt
#0 0x804834a in main()
#1 0x40037ae in __libc_start_main () from lib/libc.so.6

Ik neem aan dat de libc verwijst na int main() {} en kom die dan ook tegen
wanneer ik in het esp en ebp register zoek:

(gdb) x/100 $esp-100
0xbffff30c: 0x40154b90
0xbffff31c: 0x40154b90
0xbffff32c: 0x40014678
0xbffff33c: 0x40014e10
0xbffff34c: 0x4004dc10
0xbffff35c: 0x08048245
0xbffff36c: 0x0804837c
0xbffff37c: 0x400378ae

Maar het adress 0x804834a kan ik nergens terug vinden zowel eip ebp als
esp register.En hoe kunnen nou 4 geheugen locaties na een adress
verwijzen als bv 0xbffff33c: 0x40014e10 0x40014678 0x0804837c
0x40014678 weet iemand misschien dit?
Reacties (6)
05-11-2006, 13:34 door SirDice
Waar je rekening mee moet houden is dat een C programma
eigenlijk niet direct bij main() begint. Door het linken
wordt er een startup code toegevoegd. Deze zorgt
bijvoorbeeld voor het initialiseren van de stack en wat
huishuidelijke zaken. De startup code start dan vervolgens
de main() van het C programma.
05-11-2006, 15:17 door Anoniem
Die startup code is toch het adress van 0x8048344? Want had nog
gekeken met (gdb) i r en bleek dit adress een eip adress te zijn ik neem
aan dat dit het adress is die op de stack word gezet waardoor het
programma word geactiveerd? Want wat ik niet begrijp is dat 0x8048344
toch ook in het esp register moet staan zoals bij 0x400378ae het geval is?
05-11-2006, 18:09 door [Account Verwijderd]
[Verwijderd]
05-11-2006, 20:14 door Anoniem
Thx!!! Dat met die objdump -f test is echt handig want krijg precies dat
stukje code te zien die bij break main niet weer gaf.

Wat ik alleen niet begrijp is waarom na dat die call 0x8038258
<__libc_start_main> heeft uitgevoerd.Dat die een hlt aanroept voor
met daarachter nops.

Met die stack is trouwens nog lastig te begrijpen hoe dat precies helemaal
in elkaar zit en moeilijk om een beeld van te schetsen.

Ps. Ik kan nu ook em terug vinden in het eip adress terug vinden onder
(gdb)x/100 $esp-100
0xbfff35c: 0x0000000 0x0000000
0xbfff36c: 0x0000000 0x4001678
0xbfff37c: 0x4001678 0x0000000
0xbfff38c: 0x0000000 0x0000000
0xbfff39c: 0x0000000 0xbFFF3c4
0xbfff3ac: 0xbFFF3CC 0x8048280
07-11-2006, 22:13 door [Account Verwijderd]
[Verwijderd]
07-11-2006, 23:42 door Anoniem
misschien padding?

Nee denk het niet denk eerder dat het door de hlt komt bij de beschrijving
van de mnemocode stond:

hlt
"De processor komt in de halt-modes.Deze modus wordt alleen verlaten
door een interrupt of door een reset.(dus door ontvangst van een signaal
aan de innterupt- of drest-ingang van de processor);

Bij (gdb)disas _start geeft die weer:

0x804829c <_start+28> call 0x8048258 <__libc_start_main>
0x80482a1 <_start+33> hlt
0x80482a2 <_start+34>nop
0x80482a3 <_start+35> nop

Het lijkt erop denk ik dat die een interupt request uitvoerd voor dat die de
functie printf uitvoerd.Maar zeker weet ik niet.
Reageren

Deze posting is gelocked. Reageren is niet meer mogelijk.