1 #ifndef _GNU_SOURCE
2 #define _GNU_SOURCE
3 #endif
4 #include <unistd.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <netinet/ip_icmp.h>
8 #include <string.h>
9
10
11 #define DROPUID 1009
12 #define DROPGID 1009
13
14 // rawwrapper, aton 2004
15
16 int main(int argc, char *argv[])
17 {
18 int rfd;
19 char *argv0, *argv1;
20
21 if (argc<2)
22 {
23 printf("usage: rawwrapper <program>\n");
24 printf("argv[1] will be the raw socket\n");
25 exit(EXIT_FAILURE);
26 }
27
28 //open raw socket
29 if ((rfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP))<0)
30 {
31 perror("socket");
32 return EXIT_FAILURE;
33 }
34
35 //drop priviledges
36 setresgid(DROPGID, DROPGID, DROPGID);
37 setresuid(DROPUID, DROPUID, DROPUID);
38
39 argv0=malloc(strlen(argv[0])+1);
40 strcpy(argv0, argv[0]);
41 argv1=malloc(strlen(argv[1])+1);
42 strcpy(argv1, argv[1]);
43
44 // fill in new argv
45 argv[0]=argv1;
46 sprintf(argv[1], "%d", rfd);
47
48 //execute the client program
49 execve(argv[0], argv, NULL);
50 return EXIT_SUCCESS;
51 }