2012-03-22 101 views
15

Tôi không thực sự nhận được như thế nào mã này làm những gì nó làm:Shellcode trong C - Điều này có nghĩa là gì?

char shellcode[] = "\xbb\x00\x00\x00\x00"   
        "\xb8\x01\x00\x00\x00"     
        "\xcd\x80";     

int main() 
{ 
    int *ret; 
    ret = (int *)&ret + 2; 
    (*ret) = (int)shellcode; 
} 

Được rồi, tôi biết:

int *ret; 

đặt một con trỏ int. và:

ret = (int *)&ret + 2; 

đặt địa chỉ của ret và 2 byte (tôi nghĩ).

Nhưng tôi không có được những gì này có nghĩa là:

(int *)&ret 

Tôi biết &ret phương tiện gì nhưng không phải là ý nghĩa của (int *)&ret. Ngoài ra, làm thế nào để nó thực thi shellcode bằng cách gán giá trị của shellcode đến ret?

UPDATE: sự khác biệt giữa là gì:

(int *)&ret + 2 

và:

&ret + 2 
+3

Tò mò tại sao rất nhiều downvotes ... shellcode trông khá vô hại. – FatalError

Trả lời

16

Các 'string' shellcode chứa một số mã máy của một số loại.

int *ret; xác định biến số ret là con trỏ đến int.

Nhiệm vụ ret = (int *)&ret + 2; làm cho ret trỏ đến một vị trí có kích thước là hai int từ vị trí thực tế của chính nó (hoặc địa chỉ); đây là một địa chỉ trong ngăn xếp, có lẽ là địa chỉ trả về của hàm (main()) được lưu trữ trên ngăn xếp.

Bài tập *ret = (int)shellcode; gán địa chỉ của mã shell vào địa chỉ trả về. Do đó, khi thoát khỏi hàm main(), địa chỉ trả về là mã trình bao, nó sẽ làm bất cứ điều gì thay vì thoát khỏi chương trình bình thường.

Các phôi bao trùm vô số các tội lỗi. Mã này tạo ra một số lượng lớn các giả định không di động có thể được biện minh trên môi trường đích nhưng không nhất thiết phải ở bất kỳ nơi nào khác. &ret+2(int *)&ret + 2:


sự khác biệt giữa là gì?

Nhập, chủ yếu; đây là một trong vô số tội lỗi được đề cập trước đây. &ret có loại int ** (con trỏ đến con trỏ đến int) thay vì int * là loại của ret chính nó. Kể từ sizeof(int *) == sizeof(int **) trên tất cả các máy thực tế, dàn diễn viên chỉ đơn thuần là một lời phàn nàn từ trình biên dịch (về việc gán sai loại con trỏ tới ret) mà không thay đổi kết quả bằng số.

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