Có cách nào để làm cho objdump đọc từ STDIN thay vì một tập tin không?


8

Trong trường hợp cụ thể của tôi, tôi muốn sử dụng nó để đổ những gì tôi echo.
Tôi không muốn liên quan đến bất kỳ tập tin nào ...
Có cách nào để objdumpđọc từ STDINđó không?


Bạn có thể vui lòng giải thích tình hình của bạn nhiều hơn một chút?
lượng tử

Câu trả lời:


5

bạn luôn có thể làm

objdump -d /dev/stdin < t2.o

hoặc là

cat t2.o | objdump -d /dev/stdin

mẫu vật

[root @ myhost cc] # objdump -h / dev / stdin <t2.o

/ dev / stdin: định dạng tệp elf64-x86-64

Phần: Kích thước tên Idx VMA LMA
Tắt tệp Algn 0 .group 00000008 0000000000000000 0000000000000000 00000040 2 ** 2 NỘI DUNG, SYN SÀNG, LOẠI TRỪ, NHÓM, LINK_ONCE_DISCARD


1
cat t2.o | objdump -d /dev/stdinkhông hoạt động. /dev/stdinchỉ hoạt động khi nó tương ứng với một tập tin thực sự. Vì giải pháp của bạn yêu cầu sự hiện diện của tệp đó, điều này không trả lời OP.
Dragonroot

Điều này có thể hoạt động cho việc gọi objdumpđặc biệt này, nhưng nó có thể thất bại cho những người khác trong trường hợp nó seekhoạt động trên tệp. Khi các công cụ không có -cho stdin, đó thường là trường hợp.
Ciro Santilli 冠状 病毒 审查 事件 法轮功

5

Bạn không thể. Không có cách nào khác, bạn sẽ phải sử dụng tệp tạm thời.

Tệp nguồn readelf.c có kiểm tra vô điều kiện này (ít nhất là trong binutils 2,22-8) trước khi cố gắng mở tệp:

if (! S_ISREG (statbuf.st_mode))
    {
      error (_("'%s' is not an ordinary file\n"), file_name);
      return 1;
    }

Vì vậy, nếu các tập tin là bất cứ điều gì nhưng tập tin thường xuyên (như liên kết tượng trưng, hoặc thiết bị char như trong trường hợp của /dev/stdin, /proc/self/fd/*vv) nó sẽ không làm việc.

Ngoài ra, bạn có thể sửa đổi nguồn và sử dụng objdump đã sửa đổi, nhưng sẽ có tính di động của bạn.


0

Một loại cách giải quyết đang sử dụng tee. Vì vậy, để tháo rời một tập tin có tên inputsử dụng

cat input | tee a.out | objdump -d

Và, để đưa ra một ví dụ cho việc truyền một số byte bằng echolệnh, sau đây phải là một ví dụ tốt (Các tham số được mô tả trong câu trả lời SO tốt này ):

Để tháo chuỗi byte mã x86

b8 01 00 00 00 bb 0a 00 00 00 cd 80

tiền tố nó với 0:và sử dụng lệnh

echo "0: b8 01 00 00 00 bb 0a 00 00 00 cd 80" | xxd -r | tee a.out | objdump -D -Mintel,i386 -b binary -m i386

Đầu ra của nó là:

a.out:     file format binary
Disassembly of section .data:
00000000 <.data>:
   0:   b8 01 00 00 00          mov    eax,0x1
   5:   bb 0a 00 00 00          mov    ebx,0xa
   a:   cd 80                   int    0x80

đó chỉ là mã lắp ráp để thoát khỏi chương trình linux i386 với mã thoát 0xA.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.