2012-05-07 49 views
36

Sau khi tải một tệp thi hành vào gdb, làm cách nào để ngắt tại điểm nhập, trước khi lệnh đầu tiên được thực thi?Dừng tại hướng dẫn mã máy đầu tiên trong GDB

Tệp thi hành mà tôi đang phân tích là một phần mềm độc hại được mã hóa nên break main hoàn toàn không có gì.

+0

Đối với 'lldb', xem: [? Làm thế nào để ngăn chặn chương trình gỡ rối ngay sau khi thực hiện] (http://reverseengineering.stackexchange.com/q/9583/12021) – kenorb

Trả lời

41

Lệnh info files có thể cung cấp cho bạn một địa chỉ mà bạn có thể phá vỡ vào lúc:

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

Sự bắt đầu của. văn bản cũng có thể hoạt động. – ZillGate

+0

Điều này không thực sự làm việc cho tôi với một ELF đơn giản được tạo ra bởi 'fasm/dev/stdin test <<< $ 'định dạng ELF thực thi \ nint3''. – Ruslan

5

"b _start" hoặc "b start" có thể hoặc có thể không hoạt động. Nếu không, hãy tìm địa chỉ điểm nhập với chính sách đọc/objdump và sử dụng "b *0x<hex address>".

+0

Điều kỳ lạ là nó phá vỡ tại các điểm vào được chỉ định trong tiêu đề và tháo gỡ có vẻ tốt, nhưng một tháo gỡ thẳng của thực thi cho thấy rác. Nhưng bạn đã trả lời câu hỏi. ;) BTW, vinh dự nhận được câu trả lời từ một chàng trai ở Hex-Rays! – rickythefox

+0

'_init' từ' cru/init-first.c' dường như được chạy ngay cả trước '_start' hoặc địa chỉ mục nhập trong GCC 4.8 glibc 2.19 Ubuntu 14.04 khi tôi thử' b _init; chạy' trong GDB. Chuyện gì vậy? –

+0

Được hỏi tại: http://stackoverflow.com/questions/31379422/why-is-init-from-glibcs-csu-init-first-c-called-before-start-even-if-start-i –

3

Sau khi tải tệp thi hành vào gdb, làm cách nào để ngắt tại điểm nhập, trước khi lệnh đầu tiên được thực thi?

Bạn có thể tìm thấy những gì các chức năng này được gọi là trước int main() với set backtrace past-main on và sau khi tìm thấy họ thiết lập một breakpoint vào chúng và khởi động lại chương trình của bạn:

>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

Các giải pháp không có trí tuệ là sử dụng các tác dụng phụ không đặt được điểm ngắt:

$ 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. 

Ý tưởng lấy từ this answer at RE.SE.

+0

Điều thú vị là tôi không thể sử dụng điểm ngắt trong GDB tại ứng dụng Go cho đến khi giải pháp của bạn. Bất kỳ phương pháp nào khác không hoạt động. –

+0

cũng làm việc tốt cho tôi, nhưng sau đó thậm chí 'stepi' đã thất bại, vì vậy tôi cũng phải sử dụng' break breakpoints' để tiến xa hơn. – Ped7g

+0

@ Ped7g bạn chỉ có thể xóa điểm ngắt chính xác mà bạn đặt thành không thành công, trong ví dụ trên, nó sẽ là 'd 1'. Không cần xóa tất cả. – Ruslan

0

Bắt đầu với GDB 8.1, có một lệnh đặc biệt cho việc này: starti. Ví dụ GDB phiên:

$ 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 
Các vấn đề liên quan