在学习 LibFuzzer,需要了解一下如何通过 C 或者 C++ 与目标建立连接。
基本概念 socket(套接字)用于建立两个或多个节点间的数据通信,分为服务端和客户端。 偷一张感觉比较清晰的图放在这里
例程 以下是直接扒的示例程序,由C语言实现,暂时看这个以及上面的图就够用了
服务器端代码实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> int main () { int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct sockaddr_in serv_addr ; memset (&serv_addr, 0 , sizeof (serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1" ); serv_addr.sin_port = htons(1234 ); bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof (serv_addr)); listen(serv_sock, 20 ); printf ("Server started, listening on 127.0.0.1:1234 ...\n" ); while (1 ){ struct sockaddr_in clnt_addr ; socklen_t clnt_addr_size = sizeof (clnt_addr); int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); if (clnt_sock < 0 ){ perror("accept error" ); continue ; } printf ("Client connected.\n" ); char str[] = "Hello World!" ; write(clnt_sock, str, sizeof (str)); close(clnt_sock); printf ("Client disconnected.\n" ); } close(serv_sock); return 0 ; }
客户端代码实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> int main () { int sock = socket(AF_INET, SOCK_STREAM, 0 ); struct sockaddr_in serv_addr ; memset (&serv_addr, 0 , sizeof (serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1" ); serv_addr.sin_port = htons(1234 ); connect(sock, (struct sockaddr*)&serv_addr, sizeof (serv_addr)); char buffer[40 ]; read(sock, buffer, sizeof (buffer)-1 ); printf ("Message form server: %s\n" , buffer); close(sock); return 0 ; }
socketpair 在 本地 进程内 IPC 通信中,可以通过 sockerpair 方式来实现。 其定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 #include <sys/types.h> #include <sys/socket.h> int socketpair (int domain, int type, int protocol, int sv[2 ]) ;<socket.h> extern int socketpair (int __domain, int __type, int __protocol, int __fds[2 ]) __THROW;
执行成功后会将 文件描述符 写入 参数 fds[2] 可以用于全双工通信,即一方读,另一方写。写入方写入后会阻塞,只能等待读取方读取后才能读。 一般会读写分离,一方仅用于读,另一方仅用于写。由于文件描述符是进程共享的,读进程需要关闭写描述符,写进程则要关闭读描述符。
参考链接