如何从shellcode中提取端口号

逆向工程 部件 外壳代码
2021-06-25 14:30:10

我看到了这个shellcode,当他们使用这个connect函数时,他们传递了端口号 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

或者在其他类似的网站上:

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

但是他们推0x5C110002,他们如何从中提取4444 0x5C110002

2个回答

connect系统调用需要一个sockaddr结构作为参数,它看起来是这样的:

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

他们没有提取 4444,它只是作为一个两字节的短在堆栈上传递。您正在以connect小端顺序传递给

  • sin_family: 0x0002 (AF_INET)
  • sin_port: 0x5c11 (4444 in hex, little endian)
  • sin_addr: 0x0100007F ([127] [0] [0] [1], little endian)

我在这里找到如何用 python 转换它。

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

相反是这样的:

socket.htons(0x5c11)