web-dev-qa-db-ja.com

GDBの最初のマシンコード命令で停止する

実行可能ファイルをgdbにロードした後、最初の命令が実行される前に、エントリポイントでブレークするにはどうすればよいですか?

私が分析している実行可能ファイルは、暗号化されたマルウェアなので、break mainは何もしません。

51
rickythefox

info filesコマンドを使用すると、ブレークできるアドレスを提供できます。

(gdb) info files
    ...
    Entry point: 0x80000000
    ...
(gdb) break *0x80000000
(gdb) run
59
Jeff Ames

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
26
Ruslan

b _start "または" b start "は動作する場合と動作しない場合があります。動作しない場合は、readelf/objdumpでエントリポイントアドレスを見つけ、" b *0x<hex address> "。

5
Igor Skochinsky

実行可能ファイルをgdbにロードした後、最初の命令が実行される前に、エントリポイントでブレークするにはどうすればよいですか?

_set backtrace past-main on_でint main()の前に呼び出される関数を見つけ、それらを見つけた後、それらにブレークポイントを設定してプログラムを再起動します。

_>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
Sergei Kurenkov