for /L %i in (1,1,255) do ping -n 1 -w 60 192.168.1.%i | find "回复" >>d:\pingall.txt查找ip
socket又称套接字,是API(应用程序编程接口),背后实现了TCP/IP协议栈。Socket用于描述IP地址和端口,是一个通信链的句柄,用来实现不同虚拟机或物理机之间的通信。Socket可理解为一种特殊的文件,在服务器和客户端各自维护一个文件,并使用SocketAPI函数对其进行文件操作。在建立连接打开后,可以向各自文件写入内容供对方读取或读取对方内容,通信结束时关闭文件。
单个系统调用就可以创建任何套接字,因为套接字是相当笼统的。一旦套接字创建后,应用程序还需要调用其他函数来指定具体细节。
其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr
包括运输层、网络层、链路层,而socket所在位置如图,Socket是应用层与TCP/IP协议族通信的中间软件抽象层。
文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。
文件指针:C语言中使用文件指 针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句柄)。
为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
sys/socket.h
函数和数据结构定义
netinet/in.h
IPv4和IPv6协议
sys/un.h
UNIX机器间通信
arpa/inet.h
处理数字从操作系统字节序到网络字节序
netdb.h
映射服务到IP地址
struct sockaddr 和 struct sockaddr_in 这两个结构体用来处理网络通信的地址。
socket() 创建套接字,根据指定地址、数据类型、协议分配一个套接字的描述字及所用资源。
int socket(int domain, int type, int protocol)
domain
协议簇/域,通常为AF_INET(IPv4)、AF_INET6(IPv6)
type
套接字类型,主要是SOCK_STREAM(TCP)、SOCK_DGRAM(UDP)
protocol
通常为0
流式 SOCK_STREAM
流失套接字提供可靠的、面向连接的通信流,使用TCP协议从而保证数据传输的正确性和顺序性。
数据报SOCK_DGRAM
数据包套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,不保证是可靠的无差错的,使用数据报协议UDP。
原始SOCK_RAW
原始套接字允许对底层协议如IP或ICMP进行直接访问,功能强大但使用不便,主要用于协议开发。
htons();
作用是将端口号由主机字节序转换为网络字节序的整数值。(host to net)
inet_addr();
作用是将一个IP字符串转化为一个网络字节序的整数值,用于sockaddr_in.sin_addr.s_addr。
inet_ntoa();
作用是将一个sin_addr结构体输出成IP字符串(network to ascii)。
bind();
将一本地地址与一套接口捆绑。本函数适用于未连接的数据报或流类套接口,在connect()或listen()调用前使用。
listen();
为了接受连接,先用socket()创建一个套接口的描述字,然后用listen()创建套接口并为申请进入的连接建立一个后备日志,然后便可用accept()接受连接了。
注;一个网络连接对应了一个文件描述符,发送和接收数据最基本的方法和文件操作是完全一致的,就是read/write
。
shellcode的功能为:让漏洞程序在其本地开启一个网络端口,并在有连接连入时将shell进程的输入输出绑定到该连接上
shellcode的功能为:让漏洞程序去连接远程的攻击者机器,并且将shell进程的输入输出绑定到此连接上。
第一步会把与攻击者建立连接的文件描述符存放到rbp寄存器中,第二步会默认使用rbp寄存器中的文件描述符来重定向shell进程的输入和输出,即完成反连shell。
其实并不可能不连。你要远程攻击他,那必定得有数据通路,所以可以复用你攻击打过去的这个连接来获得交互shell。这个不连其实是不产生新的连接,也就是连接复用。
linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作。
(1)以后再打开文件,描述符可以依次增加 (2)一条shell命令,都会继承其父进程的文件描述符,因此所有的shell命令,都会默认有三个文件描述符。