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 0xBLABLA

    IDA 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.

    http://de.wikipedia.org/wiki/Data_Display_Debugger


Anmelden zum Antworten