2012-05-07 4 views
36

Nach dem Laden einer ausführbaren Datei in gdb, wie kann ich am Einstiegspunkt brechen, bevor die erste Anweisung ausgeführt wird?Stoppen beim ersten Maschinencode-Befehl in GDB

Die ausführbare Datei, die ich analysiere, ist ein Stück Malware, das verschlüsselt ist, so dass break main absolut nichts tut.

+0

Für 'lldb' finden Sie unter: [? Wie Debugger direkt nach der Ausführung stoppen] (http://reverseengineering.stackexchange.com/q/9583/12021) – kenorb

Antwort

41

Der info files Befehl, den Sie vielleicht eine Adresse geben Sie brechen könnt:

(gdb) info files 
    ... 
    Entry point: 0x80000000 
    ... 
(gdb) break *0x80000000 
(gdb) run 
+0

Der Start. Text könnte auch funktionieren. – ZillGate

+0

Dies funktioniert nicht wirklich für mich mit einem einfachen ELF generiert von 'fasm/dev/stdin test <<< $ 'Format ELF ausführbare \ nint3''. – Ruslan

5

b _start“ oder „b start“ könnte oder könnte nicht funktionieren. Wenn nicht, finde die Adresse des Einsprungpunktes mit readelf/objdump und verwende "b *0x<hex address>".

+0

Seltsame Sache ist es bricht an der Eintrittsstelle in der Kopfzeile angegeben und die Demontage sieht gut aus, aber eine gerade Demontage der ausführbaren Datei zeigt Müll. Aber du hast die Frage beantwortet. ;) Übrigens, geehrt, eine Antwort von einem Typen bei Hex-Rays zu bekommen! – rickythefox

+0

'_init' von' cru/init-first.c' scheint schon vor '_start' oder der Eingangsadresse in GCC 4.8 zu laufen glibc 2.19 Ubuntu 14.04 wenn ich versuche' b _init; in GDB laufen. Was ist los? –

+0

Frage an: http://StackOverflow.com/Questions/31379422/Why-is-Init-from-GLIBCs-CSU-INIT-first-C-Called-Before-Start-Even-If-Start-I –

3

Nach dem Laden einer ausführbaren Datei in gdb, wie kann ich am Einstiegspunkt brechen, bevor die erste Anweisung ausgeführt wird?

finden Sie, was Funktionen vor int main() mit set backtrace past-main on aufgerufen werden und nach dem Auffinden stellt sie einen Haltepunkt auf sie und das Programm neu starten:

>gdb -q main 
Reading symbols from /home/main...done. 
(gdb) set backtrace past-main on 
(gdb) b main 
Breakpoint 1 at 0x40058a: file main.cpp, line 25. 
(gdb) r 
Starting program: /home/main 

Breakpoint 1, main() at main.cpp:25 
25  a(); 
(gdb) bt 
#0 main() at main.cpp:25 
#1 0x0000003a1d81ed1d in __libc_start_main() from /lib64/libc.so.6 
#2 0x0000000000400499 in _start() 
(gdb) b _start 
Breakpoint 2 at 0x400470 
(gdb) r 
The program being debugged has been started already. 
Start it from the beginning? (y or n) y 
Starting program: /home/main 

Breakpoint 2, 0x0000000000400470 in _start() 
4

Die No-brainer Lösung ist, die Nebenwirkung zu verwenden des Scheiterns einen Haltepunkt zu setzen:

$ gdb /bin/true 
Reading symbols from /bin/true...(no debugging symbols found)...done. 
(gdb) b *0 
Breakpoint 1 at 0x0 
(gdb) r 
Starting program: /bin/true 
Warning: 
Cannot insert breakpoint 1. 
Cannot access memory at address 0x0 

(gdb) disas 
Dump of assembler code for function _start: 
=> 0xf7fdd800 <+0>:  mov eax,esp 
    0xf7fdd802 <+2>:  call 0xf7fe2160 <_dl_start> 
End of assembler dump. 

Idee von this answer at RE.SE genommen.

+0

Interessanterweise I In einer Go-Anwendung können Haltepunkte in GDB erst verwendet werden, wenn Sie die Lösung gefunden haben. Eine andere Methode funktioniert nicht. –

+0

hat auch bei mir gut funktioniert, aber dann hat auch 'stepi' versagt, also musste ich auch' delete breakpoints' verwenden um weiter zu gehen. – Ped7g

+0

@ Ped7g Sie könnten einfach den exakten Haltepunkt löschen, den Sie festgelegt haben, um fehlzuschlagen, im obigen Beispiel wäre es 'd 1'. Keine Notwendigkeit, alle zu löschen. – Ruslan

0

Beginnend mit GDB 8.1 gibt es einen speziellen Befehl dafür: starti. Beispiel GDB-Sitzung:

$ gdb /bin/true 
Reading symbols from /bin/true...(no debugging symbols found)...done. 
(gdb) starti 
Starting program: /bin/true 

Program stopped. 
0xf7fdd800 in _start() from /lib/ld-linux.so.2 
(gdb) x/5i $pc 
=> 0xf7fdd800 <_start>: mov eax,esp 
    0xf7fdd802 <_start+2>:  call 0xf7fe2160 <_dl_start> 
    0xf7fdd807 <_dl_start_user>: mov edi,eax 
    0xf7fdd809 <_dl_start_user+2>:  call 0xf7fdd7f0 
    0xf7fdd80e <_dl_start_user+7>:  add ebx,0x1f7e6