2012-05-07 27 views
36

將一個可執行文件加載到gdb之後,如何在執行第一條指令之前在入口點中斷?在GDB的第一個機器碼指令處停止

我正在分析的可執行文件是一塊加密的惡意軟件,因此break main完全沒有任何問題。

+0

對於'lldb',請參閱:[?如何停止執行後,調試器權(http://reverseengineering.stackexchange.com/q/9583/12021) – kenorb

回答

41

info files命令可能會給你,你可以打破地址:

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

的開始。文字也可能起作用。 – ZillGate

+0

對於我來說,這實際上並不適用於由'fasm/dev/stdin test <<< $'format ELF executable \ nint3''格式生成的簡單ELF。 – Ruslan

5

b _start」或「b start」可能會,也可能無法正常工作。如果沒有,請使用readelf/objdump找到入口點地址,並使用「b *0x<hex address>」。

+0

奇怪的是它在頭文件中指定的入口點處打破並且反彙編看起來不錯,但對可執行文件的直接反彙編顯示垃圾。但你回答了這個問題。 ;)順便說一句,很榮幸能從Hex-Rays的一個人那裏得到答案! – rickythefox

+0

''cru'/init-first.c'中的'_init'似乎甚至在'_start'或GCC 4.8 glibc中的入口地址之前運行2.19 Ubuntu 14.04當我嘗試'b _init;在GDB中運行。到底是怎麼回事? –

+0

提問在:http://stackoverflow.com/questions/31379422/why-is-init-from-glibcs​​-csu-init-first-c-called-before-start-even-if-start-i –

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() 
4

的沒有腦子的解決方案是使用副作用沒有設置斷點:

$ 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

+0

有趣的是,我直到您的解決方案才能在Go應用程序的GDB中使用斷點。任何其他方法都不起作用。 – 2017-08-01 11:37:53

+0

對我也很好,但是後來即使'stepi'失敗了,所以我還需要使用'delete breakpoints'來繼續。 – Ped7g

+0

@ Ped7g你可以刪除你設置的失敗的確切斷點,在上面的例子中它會是'd 1'。無需全部刪除。 – Ruslan

0

從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 
相關問題