2010-08-23 34 views
9

Xin chào, tôi đã tạo một tệp ELF bằng tay, nó có hai phần (.text và .shstrtab) và một tiêu đề chương trình tải phần .text. Phần .text là rất nhỏ và nó chỉ bao gồm sau ba hướng dẫn ...Tệp ELF bằng tay

# and exit 
    movl $0,%ebx  # first argument: exit code 
    movl $1,%eax  # system call number (sys_exit) 
    int  $0x80   # call kernel 

Đọc không phàn nàn khi tôi chạy tệp này trên tệp elf này. Nếu tôi thực hiện tập tin này, thì ngay sau khi tôi thực hiện nó, nó sẽ bị giết và thông báo "Killed" xuất hiện trên màn hình. Tôi đã xem qua bài đăng sau đây tại stackoverflow và tôi vẫn đang thực hiện.

Bây giờ mối quan tâm của tôi là chương trình này không yêu cầu bất kỳ bộ nhớ (bổ sung) nào và cũng thực sự có thể thực hiện ELF bằng tay và hy vọng nó sẽ được hệ thống chấp nhận ?.

Cảm ơn bạn,

+0

Bạn đã đọc http: // www.muppetlabs.com/~breadbox/software/tiny/teensy.html? Đây là ELF được thực hiện bằng tay đến cùng cực. – camh

+1

Có, tôi đã đọc nó, nó là một đọc tốt. – Sohail

+1

Bao giờ tìm nguyên nhân của vụ tai nạn? –

Trả lời

11

Các ELF loader có thể gửi SIGKILL đến quá trình của bạn cho một loạt các lý do; bạn có thể có một địa chỉ xấu và/hoặc độ dài ở đâu đó trong các tiêu đề.

ví dụ: Phân đoạn PT_LOAD phải ánh xạ phần thích hợp của tệp thực thi với địa chỉ hợp lý (địa chỉ thông thường cho x86 Linux là 0x08048000, mặc dù điều đó có thể không quan trọng vì nó được liên kết trang, không 0 và không quá cao) và địa chỉ ở cả hai tiêu đề phần .text và điểm nhập trong tiêu đề ELF cần phải khớp với tiêu đề đó.

Không có lý do gì khiến bạn không thể thực hiện việc này bằng tay (nếu người liên kết có thể tạo nó, vì vậy bạn có thể!) - nếu bạn thực sự muốn. Nhưng lưu ý rằng nếu bạn chỉ đơn giản là lắp ráp sau đó liên kết với các biểu tượng tước (các -s cờ để ld dưới đây):

$ cat exit.s 
.globl _start 
_start: 
movl $0,%ebx 
movl $1,%eax 
int $0x80 
$ as -o exit.o exit.s 
$ ld -s -o exit exit.o 
$ ./exit 
$ hexdump -Cv exit 
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF............| 
00000010 02 00 03 00 01 00 00 00 54 80 04 08 34 00 00 00 |........T...4...| 
00000020 74 00 00 00 00 00 00 00 34 00 20 00 01 00 28 00 |t.......4. ...(.| 
00000030 03 00 02 00 01 00 00 00 00 00 00 00 00 80 04 08 |................| 
00000040 00 80 04 08 60 00 00 00 60 00 00 00 05 00 00 00 |....`...`.......| 
00000050 00 10 00 00 bb 00 00 00 00 b8 01 00 00 00 cd 80 |................| 
00000060 00 2e 73 68 73 74 72 74 61 62 00 2e 74 65 78 74 |..shstrtab..text| 
00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 
00000090 00 00 00 00 00 00 00 00 00 00 00 00 0b 00 00 00 |................| 
000000a0 01 00 00 00 06 00 00 00 54 80 04 08 54 00 00 00 |........T...T...| 
000000b0 0c 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 |................| 
000000c0 00 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 |................| 
000000d0 00 00 00 00 60 00 00 00 11 00 00 00 00 00 00 00 |....`...........| 
000000e0 00 00 00 00 01 00 00 00 00 00 00 00    |............| 
000000ec 
$ 

... sau đó kết quả là khá tối thiểu nào (có thể là đủ tối thiểu để so sánh với thất bại của bạn tay-crafted để xem bạn đã đi sai ở đâu).

+0

Cảm ơn bạn đã trả lời, Lời khuyên của bạn rất hay. Tôi sẽ theo dõi nó. Tập tin được tạo bằng tay của tôi giờ đã trở nên khá lớn nhưng tôi vẫn nhận được kết quả tương tự khi tôi cố chạy nó. Cảm ơn bạn một lần nữa cho câu trả lời. – Sohail

+0

Tôi đã cố gắng bỏ phiếu cho câu trả lời của bạn nhưng phải mất 15 danh tiếng để làm điều đó, tôi sẽ quay trở lại khi tôi đã có nhiều. – Sohail

+0

Mục nhập PT_LOAD cần được đánh dấu là có thể đọc và thực thi được. – ysdx

0

Gần đây tôi cũng cố gắng thực hiện các thử nghiệm tương tự.
Trong quá trình xử lý, tôi cũng nhận được thông tin lỗi khi chạy tệp elf được tạo, có vẻ như là kết quả của cài đặt sai của viraddr và vị trí của phân đoạn, khác với tệp elf
của riêng bạn với tệp elf chuẩn (được biên dịch và được liên kết).
Bằng cách này, để keey sự đơn giản của tập tin tiêu chuẩn a.out elf, bạn có thể sử dụng tham số -s
để loại bỏ các bảng biểu tượng trong tập tin elf: ld -s ao