User Tools

Site Tools


laboratoare:laborator-08

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 ====
  
laboratoare/laborator-08.txt · Last modified: 2015/12/02 12:31 by vladimir.diaconescu