Mit gdb Assemblerprogramme debuggen
-
Hallo allerseits
Ich habe vor mich in der nächsten Zeit nochmal ein wenig mit Assembler x86 zu beschäftigen und habe einige Programme bereits assembliert. Jetzt möchte ich es mit dem gdb unter Linux einmal durchgehen. Dort muss ich ja einen break setzen von wo aus das Programm laufen soll. Wenn ich allerdings das Programm mit dem gdb starte und anschließend "break _start" und "run" eingebe dann ratert er direkt das Programm runter. Wie kann ich das ändern das ich das Schrittweise durchgehen kann wie bei einem mit z.B. C kompilierten Programm?Danke
-
Ich glaube, du musst den Breakpoint eine Instruktion weiter als _start o.ä. setzen. Du kannst auch absolute Displacements angeben, z.B. break 0xdeadbeaf.
Um das Displacement rauszufinden, benutze das Kommando x (examine) mit der Option /i: x /i _start
Man kann für x auch einen Zähler definieren, dann bekommst du genau die Anzahl der Instruktionen und sieht dabei auch, an welchen Adressen diese stehen.
Ich bin grad leider unter Windows und kann es nicht ausprobieren, aber so ungefähr musst du es machen
-
Vielen Dank schon mal für die Antwort! Ich habe die Adresse auch herausgefunden aber wenn ich break 0x40078 eingebe kommt "Funkction "0x40078" not defined". Mache ich was falsch?
-
Ich hatte am Anfang auch mal Probleme damit. Aber du kannst den gdb ganz gut scripten, so dass er dir Registerwerte und Stackadressen und so weiter am Stück rauswirft.
Ich glaube, das Problem bei mir waren fehlende Symboltabellen. Die müssen beim Assemblieren mit angegeben werden.
In dem Pdftext http://download-mirror.savannah.gnu.org/releases/pgubook/ , ein Linuxasmbuch von Jonathan Bartlett, findest du erste Hilfe.
-
Andyman schrieb:
Vielen Dank schon mal für die Antwort! Ich habe die Adresse auch herausgefunden aber wenn ich break 0x40078 eingebe kommt "Funkction "0x40078" not defined". Mache ich was falsch?
Da muss ein Sternchen davor, warum auch immer. Ich habe es bei mir grad wie folgt gemacht:
main.s.global _start .section .text _start: movl $1, %eax movl $2, %eax movl $3, %eax movl $4, %eax movl $5, %eax movl $6, %eax movl $7, %eax movl $8, %eax movl $9, %eax # syscall exit movl $1, %eax int $128
Makefile:
all: as main.s -o main.o ld main.o -o main
gdb wird gestartet:
$ gdb ./main GNU gdb (Gentoo 7.2 p1) 7.2 Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "i686-pc-linux-gnu". For bug reporting instructions, please see: <http://bugs.gentoo.org/>... Reading symbols from /home/alex/asm/main...(no debugging symbols found)...done. (gdb) x /11i _start 0x8048074 <_start>: mov $0x1,%eax 0x8048079 <_start+5>: mov $0x2,%eax 0x804807e <_start+10>: mov $0x3,%eax 0x8048083 <_start+15>: mov $0x4,%eax 0x8048088 <_start+20>: mov $0x5,%eax 0x804808d <_start+25>: mov $0x6,%eax 0x8048092 <_start+30>: mov $0x7,%eax 0x8048097 <_start+35>: mov $0x8,%eax 0x804809c <_start+40>: mov $0x9,%eax 0x80480a1 <_start+45>: mov $0x1,%eax 0x80480a6 <_start+50>: int $0x80 (gdb) b *0x8048088 Breakpoint 1 at 0x8048088 (gdb) run Starting program: /home/alex/asm/main Breakpoint 1, 0x08048088 in _start () (gdb) info registers eax 0x4 4 ecx 0x0 0 edx 0x0 0 ebx 0x0 0 esp 0xbffff2e0 0xbffff2e0 ebp 0x0 0x0 esi 0x0 0 edi 0x0 0 eip 0x8048088 0x8048088 <_start+20> eflags 0x200292 [ AF SF IF ID ] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x0 0 (gdb) step step stepi stepping (gdb) stepi 0x0804808d in _start () (gdb) info registers eax 0x5 5 ecx 0x0 0 edx 0x0 0 ebx 0x0 0 esp 0xbffff2e0 0xbffff2e0 ebp 0x0 0x0 esi 0x0 0 edi 0x0 0 eip 0x804808d 0x804808d <_start+25> eflags 0x200292 [ AF SF IF ID ] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x0 0 (gdb) stepi 0x08048092 in _start () (gdb) info registers eax 0x6 6 ecx 0x0 0 edx 0x0 0 ebx 0x0 0 esp 0xbffff2e0 0xbffff2e0 ebp 0x0 0x0 esi 0x0 0 edi 0x0 0 eip 0x8048092 0x8048092 <_start+30> eflags 0x200292 [ AF SF IF ID ] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x0 0 (gdb) c Continuing. Program exited normally. (gdb) q
Viel Spass!
Kleiner Nachtrag zu verwendeten Versionen:$ as --version GNU assembler (GNU Binutils) 2.20.1.20100303 Copyright 2009 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or later. This program has absolutely no warranty. This assembler was configured for a target of `i686-pc-linux-gnu'. $ ld --version GNU ld (GNU Binutils) 2.20.1.20100303 Copyright 2009 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) a later version. This program has absolutely no warranty.
-
Hallo,
kennt wer zufällig eine guten Kostenlosen Grafischen Debugger für Linux?Ich hatte da zwar mal einen der war so ähnlich wie der OllyDebugger aber das ding das ich da hatte hat keine Kommentare angezeigt.
Da konnte ich nix mit Anfangen.
Ich hab halt keine lust immer nach den Adressen zu gucken da kriegt man ja Augenkrebse. xD
CALL 0xBLABLA ; printf <-- So wäre es gut
Aber da stand nur:
CALL 0xBLABLAIDA Free gibts nur kostenlos für Windows sowie ich das gesehen habe oder ?
-
*f schrieb:
Hallo,
kennt wer zufällig eine guten Kostenlosen Grafischen Debugger für Linux?z.B.