Tak jak pisałem ostatnio, dziś będę używał narzędzia GDB. Służy ono do analizowania kodu programów napisanych w C lub C++. Niestety jeżeli chodzi o składnie desasemblera to znam tylko Intela i nim będę się posługiwał i tym programie, co powoduje to że muszę je skonfigurować i to wygląda następująco:
gdb -q
(gdb) set disassembly-flavor intel
(gdb) quit
po skonfigurowaniu, mogę teraz przejść do pracy, tylko jeszcze będę musiał prze-kompilować program przy użyciu gcc z parametrem -g, który jest odpowiedzialny za wprowadzenie dodatkowych informacji jak będę debugował.
gdb -q ./a.out
Reading symbols from /home/domek/c/a.out...done.
(gdb) list
1 #include <stdio.h>
2
3 int main() {
4 int i;
5 for(i = 0; i < 10; i++) {
6 puts("Hello, world!\n");
7 }
8 return 0; // Informuje OS o zakonczeniu programu
9 }
(gdb) di
directory disable disassemble disconnect display
(gdb) dis
disable disassemble disconnect display
(gdb) disassemble main
Dump of assembler code for function main:
0x000000000040055c <+0>: push %rbp
0x000000000040055d <+1>: mov %rsp,%rbp
0x0000000000400560 <+4>: sub $0x10,%rsp
0x0000000000400564 <+8>: movl $0x0,-0x4(%rbp)
0x000000000040056b <+15>: jmp 0x40057b <main+31>
0x000000000040056d <+17>: mov $0x400634,%edi
0x0000000000400572 <+22>: callq 0x400440 <puts@plt>
0x0000000000400577 <+27>: addl $0x1,-0x4(%rbp)
0x000000000040057b <+31>: cmpl $0x9,-0x4(%rbp)
0x000000000040057f <+35>: jle 0x40056d <main+17>
0x0000000000400581 <+37>: mov $0x0,%eax
0x0000000000400586 <+42>: leaveq
0x0000000000400587 <+43>: retq
End of assembler dump.
(gdb) run
Starting program: /home/domek/c/a.out
Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2
Try: zypper install -C "debuginfo(build-id)=ecb8ef1a6904a2a3ec60a527f415f520c8636158"
Missing separate debuginfo for /lib64/libc.so.6
Try: zypper install -C "debuginfo(build-id)=bd1473e8e6a4c10a14731b5be4b35b4e87db2af7"
Breakpoint 1, main () at zad1.c:5
5 for(i = 0; i < 10; i++) {
(gdb)
Widzę, że mam problemy przy uruchomieniu tego programu w debuggerze, ale spokojnie Suse podpowiedział mi co muszę zainstalować i powtórzę tą operacje. Zainstalowałem brakującą bibliotekę i oto wynik:
(gdb) break mian
Function "mian" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (mian) pending.
(gdb) run
Starting program: /home/domek/c/a.out
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
[Inferior 1 (process 15408) exited normally]
(gdb) info registers eip
The program has no registers now.
(gdb)
Jak już mam wszystko to mogę omówić co tu robiłem, na początku sprawdziłem jak wygląda kod, później zobaczyłem maina w wersji assemblera i jak można zaobserwować, tutaj podawane są na początku zakresy pamięci, nie jak było to w przypadku objdumpa. Chciałem uzyskać informacje o instrukcji RIP, który wskazuje on na adres pamięci instrukcji deasemmblacji funkcji main i udało mi się uzyskać :
break main
Breakpoint 1 at 0x400564: file zad1.c, line 5.
Debbuger GDB ma możłiwośc bezpośredniego badania pamięci i jest to polecenie x.Sprawdzanie pamięci jest bardzo ważne dla każdej osoby, która chce poznać dokładnie program, bo możemy zmienić składnie z systemu szesnastkowego na inny. Proponuje każdemu posprawdzanie tego jak to działa bo u mnie wygląda to tak:
(gdb) x/x $rip
0x400564 <main+8>: 0x00fc45c7
(gdb) x/u $rip
0x400564 <main+8>: 16532935
(gdb) x/t $rip
0x400564 <main+8> 00000000111111000100010111000111
Dziś narazie wystarczy i mam nadzieje, wy czytający ten post, dowiedzieliście się czegoś więcej i spokojnie jeszcze do tego postu wrócę by opisać co możemy dalej z tym robić :)
Brak komentarzy:
Prześlij komentarz