2009-11-06 34 views
48

Tôi đã sử dụng objdump để xem mã lắp ráp trong các tệp nhị phân Linux ELF.Làm cách nào để kiểm tra nội dung của phần dữ liệu của tệp ELF trên Linux?

Đôi khi có một bước nhảy gián tiếp thông qua một bảng nhảy được lưu trữ trong phần rodata (dữ liệu chỉ đọc).

Cách lấy objdump hoặc bất kỳ công cụ nào khác để hiển thị cho tôi nội dung của phần dữ liệu này?

Tôi có thể thực thi chương trình và kiểm tra các địa chỉ liên quan trong trình gỡ lỗi, nhưng tôi không muốn làm điều đó vì nó phải được thực hiện tương tác.

Câu trả lời lý tưởng sẽ xác định một công cụ sẽ không chỉ hiển thị cho tôi nội dung nhưng sẽ cho phép tôi kiểm soát định dạng hiển thị, nhiều như od.

Trả lời

67
objdump -s -j .rodata exefile 

đưa ra một hex/in bãi ASCII side-by-side của các nội dung của phần rodata như:

Contents of section .rodata: 
0000 67452301 efcdab89 67452301 efcdab89 gE#.....gE#..... 
0010 64636261 68676665 64636261 68676665 dcbahgfedcbahgfe 

Nó không giống như có điều gì trong đó để kiểm soát định dạng, nhưng đó là một sự khởi đầu. Bạn luôn có thể undump hex và thức ăn nó để od, tôi giả sử :)

+2

Tuyệt vời! Tôi đã thử điều này nhưng tôi không nghĩ rằng để bao gồm các dấu chấm đẫm máu ... –

+3

Làm thế nào bạn có thể nhận được các dữ liệu bán phá giá ở định dạng nhị phân từ một phần ELF? Một cái gì đó như objdump -s -j- sẽ rất tuyệt. – Bogatyr

+0

@Bogatyr: cf. câu trả lời của tôi. – ysdx

13
readelf -x .rodata hello_world.o 

cho:

Hex dump of section '.rodata': 
    0x00000000 48656c6c 6f20776f 726c6421 0a  Hello world!. 

Bạn nên thích readelf khi có thể từ objdump đơn giản là không hiển thị một số bộ phận như .symtab: Why does objdump not show .bss, .shstratab, .symtab and .strtab sections?

Bạn cũng có thể trích xuất các byte thô với các kỹ thuật được đề cập tại: How do you extract only the contents of an ELF section và như đã đề cập by ysdx.

7

Bạn có thể lấy RAW (không hexdump-ed) phần ELF với:

# To a file: 
objcopy file /dev/null --dump-section .text=text.data 
# To stdout: 
objcopy file /dev/null --dump-section .text=/dev/stdout | cat 

Ở đây tôi đang sử dụng | cat để buộc stdout là một ống. /dev/stdout có thể hoạt động bất ngờ nếu stdout là một tệp. .text=- không gửi tới thiết bị xuất chuẩn nhưng đến tệp -.

Tuy nhiên objcopy and objdump have some deficiencies (vì chúng dựa trên BFD tóm tắt các định dạng thực thi khác nhau).

Cập nhật: Tôi đã viết tool để làm điều này không phụ thuộc vào BFD.

+0

'--dump-section' là một chút gần đây. Nó đã được thêm tại: http://sourceware-org.1504.n7.nabble.com/Commit-objcopy-Add-dump-section-option-td256052.html Tại sao nó tốt hơn '--only-section'? –

+0

Bạn nhận được một phiếu bầu từ tôi để tìm kiếm (và viết!) Một công cụ được xây dựng nhiều mục đích hơn so với câu trả lời của tôi. – hobbs

Các vấn đề liên quan