Cách trích xuất số cổng từ shellcode

Sep 27 2020

Tôi đã thấy mã shell này và khi họ sử dụng connectchức năng, họ chuyển số cổng 4444:

set_address:
  push byte 0x05         ; retry counter
  push 0x0100007F        ; host 127.0.0.1
  push 0x5C110002        ; family AF_INET and port 4444
  mov esi, esp           ; save pointer to sockaddr struct

Hoặc trong trang web khác như vậy:

0000001A      push dword 0x5c110002   ; [0x5c110002, 0x81caa8c0, 0x1, 0x0] // sin_port and sin_family (4444, 0x0002)

Nhưng họ đẩy 0x5C110002, làm thế nào họ trích xuất 4444 từ 0x5C110002?

Trả lời

2 ShaneReilly Sep 28 2020 at 07:30

Các connectsyscall mất một sockaddrcấu trúc như một cuộc tranh cãi, mà trông giống như sau:

struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

Họ không giải nén 4444, nó chỉ đơn giản được chuyển vào ngăn xếp dưới dạng một đoạn ngắn hai byte. Bạn đang chuyển đến connect, theo thứ tự nhỏ bé:

  • sin_family: 0x0002 (AF_INET)
  • sin_port: 0x5c11 (4444 in hex, little endian)
  • sin_addr: 0x0100007F ([127] [0] [0] [1], little endian)
E235 Sep 27 2020 at 16:23

Tôi đã tìm thấy ở đây cách chuyển đổi nó bằng python.

import socket
port = 4444
hex(socket.htons(port))
Result : 0x5c11 

Ngược lại là như vậy:

socket.htons(0x5c11)