Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stopping at the first machine code instruction in GDB

After loading an executable into gdb, how do I break at the entry point, before the first instruction is executed?

The executable I'm analyzing is a piece of malware that's encrypted so break main does absolutely nothing.

like image 802
rickythefox Avatar asked May 07 '12 14:05

rickythefox


People also ask

How do I stop a program in GDB?

To exit GDB, use the quit command (abbreviated q ), or type an end-of-file character (usually C-d ). If you do not supply expression , GDB will terminate normally; otherwise it will terminate using the result of expression as the error code.

At which point does GDB stop a running program?

gdb will stop your program at whatever line it has just executed. From here you can examine variables and move through your program. To specify other places where gdb should stop, see the section on breakpoints below.

Can GDB undo an executed instruction?

If the target environment supports it, gdb can allow you to “rewind” the program by running it backward. A target environment that supports reverse execution should be able to “undo” the changes in machine state that have taken place as the program was executing normally.

What does finish do in GDB?

Description. This command continues execution of the current function until it returns to its caller.


2 Answers

Starting with GDB 8.1, there's a special command for this: starti. Example GDB session:

$ 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 
like image 54
Ruslan Avatar answered Sep 20 '22 22:09

Ruslan


The info files command might give you an address you can break on:

(gdb) info files     ...     Entry point: 0x80000000     ... (gdb) break *0x80000000 (gdb) run 
like image 40
Jeff Ames Avatar answered Sep 18 '22 22:09

Jeff Ames