int cr_exec(int pid, char **opt) { char *sys_name = opt[0]; struct syscall_exec_desc *si; struct parasite_ctl *ctl; struct vm_area_list vmas; int ret = -1, prev_state; struct proc_status_creds *creds; if (!sys_name) { pr_err("Syscall name required\n"); goto out; } si = find_syscall(sys_name); if (!si) { pr_err("Unknown syscall [%s]\n", sys_name); goto out; } if (seize_catch_task(pid)) goto out; prev_state = ret = seize_wait_task(pid, -1, &creds); if (ret < 0) { pr_err("Can't seize task %d\n", pid); goto out; } /* * We don't seize a task's threads here, and there is no reason to * compare threads' creds in this use case anyway, so let's just free * the creds. */ free(creds); ret = collect_mappings(pid, &vmas, NULL); if (ret) { pr_err("Can't collect vmas for %d\n", pid); goto out_unseize; } ctl = parasite_prep_ctl(pid, &vmas); if (!ctl) { pr_err("Can't prep ctl %d\n", pid); goto out_unseize; } ret = execute_syscall(ctl, si, opt + 1); if (ret < 0) pr_err("Can't execute syscall remotely\n"); parasite_cure_seized(ctl); out_unseize: unseize_task(pid, prev_state, prev_state); out: return ret; }
int main(int argc, char *argv[]) { int debug = 0; if (!seed_random()) { return 1; } if (argc > 1 && strcmp(argv[1], "-d") == 0) { debug = 1; } /* FILE *fp = fopen("/dev/tty", "w"); fprintf(fp, "randasys process group is %d\n", getpgrp()); fclose(fp); */ install_signal_handlers(); while(1) { callnum = find_syscall(); args[0] = get_randnum(0, ULONG_MAX); args[1] = get_randnum(0, ULONG_MAX); args[2] = get_randnum(0, ULONG_MAX); args[3] = get_randnum(0, ULONG_MAX); args[4] = get_randnum(0, ULONG_MAX); args[5] = get_randnum(0, ULONG_MAX); if (debug) { printf("syscall(%d, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X, 0x%X); \r", callnum, args[0], args[1], args[2], args[3], args[4], args[5]); fflush(stdout); } syscall(callnum, args[0], args[1], args[2], args[3], args[4], args[5]); } return 0; }
int main(int argc, char *argv[]) { int i; int debug = 0, zero_mode = 0; if (!seed_random()) { return 1; } for (i = 1; i < argc; i++) { if (!strcmp(argv[i], "-d")) debug = 1; else if (!strcmp(argv[i], "-z")) zero_mode = 1; } memset(args, 0, sizeof(unsigned long) * 6); install_signal_handlers(); while (1) { callnum = find_syscall(); if (!zero_mode) get_big_randnum(&args[0], sizeof(unsigned long) * 6); if (debug) { printf("syscall(%lu, 0x%lX, 0x%lX, 0x%lX, 0x%lX, " "0x%lX, 0x%lX); \n", callnum, args[0], args[1], args[2], args[3], args[4], args[5]); fflush(stdout); } syscall(callnum, args[0], args[1], args[2], args[3], args[4], args[5]); } return 0; }
int main(int argc, char *argv[]) { struct syscall_desc *scall; unsigned int n; char *gids, *endp; int uid, umsk, ch; uid = -1; gids = NULL; umsk = 0; while ((ch = getopt(argc, argv, "g:u:U:")) != -1) { switch(ch) { case 'g': gids = optarg; break; case 'u': uid = (int)strtol(optarg, &endp, 0); if (*endp != '\0' && !isspace((unsigned char)*endp)) { fprintf(stderr, "invalid uid '%s' - number " "expected\n", optarg); exit(1); } break; case 'U': umsk = (int)strtol(optarg, &endp, 0); if (*endp != '\0' && !isspace((unsigned char)*endp)) { fprintf(stderr, "invalid umask '%s' - number " "expected\n", optarg); exit(1); } break; default: usage(); } } argc -= optind; argv += optind; if (argc < 1) { fprintf(stderr, "too few arguments\n"); usage(); } if (gids != NULL) { fprintf(stderr, "changing groups to %s\n", gids); set_gids(gids); } if (uid != -1) { fprintf(stderr, "changing uid to %d\n", uid); if (setuid(uid) < 0) { fprintf(stderr, "cannot change uid: %s\n", strerror(errno)); exit(1); } } /* Change umask to requested value or to 0, if not requested. */ umask(umsk); for (;;) { scall = find_syscall(argv[0]); if (scall == NULL) { fprintf(stderr, "syscall '%s' not supported\n", argv[0]); exit(1); } argc--; argv++; n = call_syscall(scall, argv); argc -= n; argv += n; if (argv[0] == NULL) break; argc--; argv++; } /* Close the descriptors left open */ while (ndescriptors > 0) { close(descriptor_get(ndescriptors - 1)); ndescriptors--; } exit(0); }