2012-09-04 26 views
5

Tôi đọc bài viết này: http://static.patater.com/gbaguy/day3pc.htmĐiều gì sẽ xảy ra nếu đăng ký phân đoạn CS được thay đổi?

Nó bao gồm các câu

Đừng bao giờ ĐỔI CS !!

Nhưng chính xác điều gì sẽ xảy ra nếu bạn sửa đổi thanh ghi phân đoạn CS? Tại sao nó rất nguy hiểm?

+2

'CS' = phân đoạn mã. Tôi cho rằng việc thay đổi nó tương đương (theo một nghĩa nào đó) với một 'jmp' sai đường. – valdo

+5

Tài liệu đó có vẻ không đáng tin cậy: "ĐỪNG thay đổi' CS' !!, nhưng bạn có thể đọc 'CS' như sau:' mov ds, cs'; đặt giá trị 'CS' vào' D'S. " Vâng, trong x86 không có lệnh nào như 'mov ds, cs' hay bất kỳ' mov segreg, segreg' khác. Để đọc giá trị của 'cs', bạn có thể sử dụng' mov reg, cs; mov ds, reg' (trong đó 'reg' có thể là' ax', 'bx',' cx' vv ...) hoặc 'đẩy cs; pop ds'. Hơn nữa, nếu bạn quyết định không * thay đổi * thay đổi 'cs', tất cả các cuộc gọi ngắt sẽ hết câu hỏi (ví dụ: các dịch vụ BIOS, DOS và Linux). http://web.itu.edu.tr/kesgin/mul06/intel/instr/mov.html – nrz

+1

@nrz: Không có những thứ như "dịch vụ Linux" có thể truy cập thông qua các cuộc gọi 'far' (ngắt/syscalls hoạt động khác nhau, mặc dù chúng dẫn đến thay đổi trong' cs ', _caller_ không thể kiểm soát mục tiêu đó' cs' sẽ là gì, được quyết định bởi hệ điều hành khi thiết lập các mục IDT/syscall msrs). Ack với mọi thứ khác, rõ ràng 'cs' _can_ được thay đổi, chỉ trừ khi đoạn mã đích tồn tại và được thiết lập theo cách mà mục tiêu' eip' có thể truy cập được, mọi cuộc gọi như vậy sẽ gây ra lỗi '# GP' và ứng dụng sẽ hủy. –

Trả lời

7

cs là đoạn mã. cs:ip, có nghĩa là cs cùng với ip (con trỏ chỉ dẫn) trỏ đến vị trí của lệnh tiếp theo. Vì vậy, bất kỳ thay đổi nào đối với cs hoặc ip hoặc cả hai thay đổi địa chỉ từ nơi lệnh tiếp theo sẽ được tìm nạp và thực thi.

Thông thường, bạn thay đổi cs với một jmp (nhảy xa), call (cuộc gọi dài), retf, int3, int hay iret. Trong 8088 và 8086 pop cs cũng có sẵn (opcode 0x0F). pop cs sẽ không hoạt động ở 186+, trong đó opcode 0x0F được dành riêng cho các hướng dẫn nhiều byte. http://en.wikipedia.org/wiki/X86_instruction_listings

Không có gì nguy hiểm khi nhảy dài hoặc cuộc gọi dài. Bạn chỉ cần biết nơi bạn nhảy hoặc gọi và trong chế độ bảo vệ, bạn cần phải có đủ quyền để làm điều đó. Trong chế độ thực 16 bit (ví dụ: DOS), bạn có thể nhảy và gọi đến địa chỉ nào bạn muốn, ví dụ: jmp 0xF000:0xFFF0 bộ cs đến 0xF000ip đến 0xFFF0, là địa chỉ bắt đầu của mã BIOS và do đó khởi động lại máy tính. Các địa chỉ bộ nhớ khác nhau có mã khác nhau và do đó có thể gây ra các loại kết quả khác nhau, trong lý thuyết mọi thứ có thể xảy ra (nếu bạn nhảy vào mã BIOS được sử dụng để định dạng ổ đĩa cứng, với giá trị đăng ký và/hoặc ngăn xếp hợp lệ thì ổ cứng sẽ được định dạng 'như yêu cầu'). Trong thực tế, jmp 's và call' s để hầu hết các địa chỉ có thể dẫn đến opcode không hợp lệ hoặc một số ngoại lệ khác (chia cho số không, chia tràn, vv) khá sớm.

+0

Chỉ thay đổi 'cs' thường sai. Thông thường, 'cs' và' xip' được thay đổi cùng nhau hoặc chỉ thay đổi 'xip'. –

+3

@AlexeyFrunze Vâng, cách duy nhất để thay đổi chỉ 'cs' mà không thay đổi/thiết lập' ip'/'eip' /' rip' là 'pop cs', chỉ có sẵn trong 8088 và 8086. Trong 186+ bạn có thể ' t thay đổi 'cs' mà không thay đổi/thiết lập cũng' ip'/'eip' /' rip'. 'pop cs' có thể được sử dụng trong mã obfuscation được nhắm mục tiêu cho 8088/8086 (hoặc 8088/8086 giả lập). – nrz

0

Trong chế độ được bảo vệ và chế độ dài (tức là không phải chế độ 16 bit), thanh ghi phân khúc bao gồm CS không còn chỉ là 4 bit địa chỉ bổ sung. Chúng chỉ mục vào bảng mô tả phân đoạn, với giới hạn cơ số + (cơ sở bình thường = 0 giới hạn = 4GiB, tức là mô hình bộ nhớ phẳng), nhưng cũng với các thuộc tính khác.

Trình mô tả đoạn mã xác định chế độ CPU (ví dụ: chế độ tương thích 32 bit so với chế độ dài 64 bit). Trên hạt nhân 64 bit, quy trình không gian người dùng 64 bit có thể tạo một mã số far jmp cho một số mã 32 bit. Điều này là không hữu ích trong thực tế, và thậm chí có thể phá vỡ khi hệ điều hành trở lại quá trình của bạn sau khi chuyển đổi ngữ cảnh.

TODO: tìm kiếm liên kết nơi ai đó đã trình bày cách thực hiện việc này. Tôi nghĩ thậm chí còn có một câu hỏi gần đây về việc này với một câu trả lời chi tiết về cách thậm chí tìm ra số phân khúc phù hợp.

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