This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | Next revision Both sides next revision | ||
laboratoare:laborator-08 [2015/12/02 04:34] adrian.bogatu |
laboratoare:laborator-08 [2015/12/02 05:23] adrian.bogatu |
||
---|---|---|---|
Line 181: | Line 181: | ||
Pentru continuarea programului după eventuala sa oprire într-un breakpoint, puteți folosi comanda ''continue''. | Pentru continuarea programului după eventuala sa oprire într-un breakpoint, puteți folosi comanda ''continue''. | ||
+ | |||
+ | Un alt lucru interesant în GDB este comanda ''commands'', care poate asocia unui breakpoint un bloc de comenzi GDB ce vor fi executate la fiecare oprire în breakpoint-ul respectiv. | ||
+ | |||
+ | Exemplu: | ||
+ | <code> | ||
+ | (gdb) break *0x004013af | ||
+ | Breakpoint <n> at 0x4013af | ||
+ | (gdb) commands <n> | ||
+ | Type commands for breakpoint(s) <n>, one per line. | ||
+ | End with a line saying just "end" | ||
+ | > print $eax | ||
+ | > x/i $eip | ||
+ | > end | ||
+ | </code> | ||
+ | |||
+ | Pentru a nu rămâne blocat în breakpoint (spre exemplu dacă scrieți un script de gdb), puteți adăuga în blocul de instrucțiuni și comanda ''continue''. | ||
=== Parcurgerea instrucțiunilor === | === Parcurgerea instrucțiunilor === | ||
Line 211: | Line 227: | ||
==== [0.5p] 7. Afișarea unor informații la fiecare trecere printr-un breakpoint ==== | ==== [0.5p] 7. Afișarea unor informații la fiecare trecere printr-un breakpoint ==== | ||
- | ==== [1p] 8. Afișarea adresei de retur a unei funcții ==== | + | |
+ | Folosind executabilul creat la exercițiul anterior (''gdb-tutorial.asm''), trebuie să setați un breakpoint la intrare în bucla din program (când se mută în subregistrul ''al'' un caracter din șirul input). În plus, trebuie să adăugați o serie de comenzi astfel încât la fiecare intrare în buclă, GDB să afișeze valoarea subregistrului ''al''. **Hint!** folosiți comanda ''commands''. | ||
+ | |||
+ | ==== [1p] 8. Afișarea adresei de retur ale unor funcții ==== | ||
+ | |||
+ | Folosind tot executabilul de mai înainte, afișați adresele de return ale tuturor funcțiilor din program (gets, atoi, printf, usage). Pentru cazul funcției usage, trebuie să porniți programul fără parametri. | ||
==== [0.5p] 9. Tutorial: Depanarea unui Segfault folosind GDB ==== | ==== [0.5p] 9. Tutorial: Depanarea unui Segfault folosind GDB ==== | ||
+ | |||
+ | Pentru acest tutorial pornim de la fișierul sursă ''segfault-tutorial.asm''. Înainte de a începe tutorialul, citiți sursa, înțelegeți ce face și apoi asamblați și link-editați programul. | ||
+ | |||
+ | Dacă încercați să rulați programul fără parametri, se poate observa că progamul "crapă". Dacă executăm programul sub gdb, putem observa că programul primește ''SIGSEGV''. Pentru a putea determina problema, executăm comanda ''backtrace'', care arată ultimele stack frame-uri prin care execuția programului a trecut. În cazut nostru, doar două: | ||
+ | <code> | ||
+ | (gdb) backtrace | ||
+ | #0 0x7607d2c3 in strcat () ... | ||
+ | #1 0x00000000 in ?? () | ||
+ | </code> | ||
+ | |||
+ | Ne dăm seama că frame-ul interesant pentru noi este ''#0''. Pentru a schimba frame-ul curent folosim comana ''frame <nr. frame>''. Odată ce suntem pe frame-ul ce ne interesează putem să încercăm dezasamblarea programului pentru a identifica problema. | ||
+ | |||
+ | După instrucțiunea ''disassemble'', putem observa instruction pointer-ul (notat pe dezasamblarea din GDB cu ''=>'' în dreptul unei instrucțiuni) că a rămas la instrucțiunea | ||
+ | <code>mov eax, DWORD PTR [ecx]</code> | ||
+ | |||
+ | Deja putem bănui o posibilă cauză a segmentation fault-ului. Inspectați registrul ecx. Ce valoare are? Ce încearcă să facă instrucțiunea cu probleme? | ||
+ | |||
==== [1.5p] 10. Rezolvarea unui Segfault ==== | ==== [1.5p] 10. Rezolvarea unui Segfault ==== | ||
+ | |||
+ | |||
+ | |||
==== [1p] 11. Tutorial: IDA ==== | ==== [1p] 11. Tutorial: IDA ==== | ||
==== [1.5p] Bonus: Modificarea control-flow-ului unui program folosind GDB ==== | ==== [1.5p] Bonus: Modificarea control-flow-ului unui program folosind GDB ==== | ||
==== [2p] Bonus: Decompilarea unui program folosind IDA ==== | ==== [2p] Bonus: Decompilarea unui program folosind IDA ==== | ||