在入口点设置断点失败 (GDB)

逆向工程 x86 数据库 转储 断点
2021-06-30 18:07:25

我目前正在使用 GDB 练习一些 RE,并且遇到问题只是在第一条/第二条指令上停止运行/启动。我是新来的GDB / RE,有一个有限的一些GDB的内部运作的知识。到目前为止,当我打开程序时,我已经完成了:

(gdb) set disassembly-flavor intel
(gdb) file /path/to/binary
(gdb) info file
Symbols from "/path/to/binary".                                                                                                
Local exec file:                                                                                                          
    `/path/to/binary', file type elf32-i386.                                                                               
    Entry point: 0x8048450
    .
    .
    .
(gdb) b *0x8048450
(gdb) start
Temporary breakpoint 2 at 0x80485f7                                                                                       
Starting program: /path/to/binary                                                                                              
During startup program exited with code 1.

所以在入口点明确设置断点是没有用的。下面是命令的输出:

 objdump /path/to/binary -M intel -D

在前面的内存地址。

08048450 <_start>:
 8048450:       31 ed                   xor    ebp,ebp
 8048452:       5e                      pop    esi                                                                        
 8048453:       89 e1                   mov    ecx,esp                                                                    
 8048455:       83 e4 f0                and    esp,0xfffffff0                                                             
 8048458:       50                      push   eax                                                                        
 8048459:       54                      push   esp                                                                        
 804845a:       52                      push   edx                                                                        
 804845b:       68 c0 86 04 08          push   0x80486c0                                                                  
 8048460:       68 60 86 04 08          push   0x8048660                                                                  
 8048465:       51                      push   ecx                                                                        
 8048466:       56                      push   esi                                                                        
 8048467:       68 e9 85 04 08          push   0x80485e9                                                                  
 804846c:       e8 bf ff ff ff          call   8048430     <__libc_start_main@plt>                                            
 8048471:       f4                      hlt                                                                               
 8048472:       66 90                   xchg   ax,ax                                                                      
 8048474:       66 90                   xchg   ax,ax                                                                      
 8048476:       66 90                   xchg   ax,ax                                                                      
 8048478:       66 90                   xchg   ax,ax                                                                      
 804847a:       66 90                   xchg   ax,ax                                                                      
 804847c:       66 90                   xchg   ax,ax                                                                      
 804847e:       66 90                   xchg   ax,ax

我的总体目标是使用 b *Mem, jump *Mem 技术跳转到程序中的特定函数,并在该函数中执行代码。然而,为了做到这一点,我相信我需要能够在程序运行时停止它。

1个回答

http://www.delorie.com/gnu/docs/gdb/gdb_29.html

GDB 在恢复执行时通常会忽略断点,直到至少执行了一条指令。如果它不这样做,您将无法在不首先禁用断点的情况下继续通过断点。无论程序停止时断点是否已经存在,这条规则都适用。

你可能会被它咬到;加载时,gdb将指令指针放在第一条指令处,启动程序时不会中断。

根据this question and answer,这似乎取决于您使用的gdb版本,禁用ASLR可能会有所帮助(不过我认为这不会发生在您的情况下,因为您在加载特定程序的实例)。

但是我发现这个问题有一个技巧可以在执行的第一条指令上打破;当我测试它时,它甚至在将执行传递到入口点之前停止在 dynaloader 中。

尽管如此,我还是不明白为什么你绝对需要在入口点有一个断点。如果您想在程序执行第一条指令之前更改任何内容,请在运行程序之前进行。例如,您可以将入口点处的指令更改为jmp my_special_function,这可能需要比 处的一条指令多几个字节_start,并使您的特殊函数在 之前的 4 条指令中结束push,然后jmp8048458您可以在加载程序后执行所有这些操作,然后再运行它。