将可执行文件加载到gdb后,如何在执行第一条指令之前在入口点中断?
我正在分析的可执行文件是一段加密的恶意软件,因此break main
绝对没有。
答案 0 :(得分:55)
info files
命令可能会为您提供一个可以中断的地址:
(gdb) info files
...
Entry point: 0x80000000
...
(gdb) break *0x80000000
(gdb) run
答案 1 :(得分:21)
从GDB 8.1开始,有一个特殊的命令:starti
。示例GDB会话:
$ 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
答案 2 :(得分:12)
毫无疑问的解决方案是使用失败的副作用来设置断点:
$ 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.
来自this answer at RE.SE的想法。
答案 3 :(得分:5)
&#34; b _start
&#34;或&#34; b start
&#34;可能会也可能不会奏效。如果没有,请使用readelf / objdump查找入口点地址,并使用&#34; b *0x<hex address>
&#34;。
答案 4 :(得分:3)
将可执行文件加载到gdb后,如何在执行第一条指令之前在入口点中断?
您可以在int main()
之前找到set backtrace past-main on
之前调用的函数,并在找到它们之后设置断点并重新启动程序:
>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 ()