已知root密码,如何在Linux环境下C程序中以root身份执行指定函数?
Linux 普通C程序通过已知root密码执行高权限操作实现方案
核心思路
由于你的程序无法设置setuid权限,也没有预配置的sudo提权规则,无法直接在当前进程内提升权限,因此唯一可行方案是:
- 拆分高权限逻辑为可独立执行的单元
- 在主程序内创建子进程调用
sudo命令,通过管道将已获取的root密码传递给sudo完成提权,间接执行高权限逻辑
具体实现步骤
1. 拆分高权限逻辑
将int read_magic_file(int x)的逻辑单独封装为独立可执行文件,例如命名为read_magic,接收整数x作为命令行参数,执行完成后将原函数返回值作为进程退出码返回。
2. 主程序调用sudo完成提权执行
利用sudo的-S参数(指定从标准输入读取密码),通过父子进程管道传递密码,示例代码如下:
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/wait.h> #include <string.h> int main() { // 示例:已提前获取的root密码、已确定的参数x const char* input_root_pass = "用户输入的root密码"; int x = 1024; // 你已确定的参数x的值 int pipe_fd[2]; if (pipe(pipe_fd) != 0) { perror("创建管道失败"); return EXIT_FAILURE; } pid_t child_pid = fork(); if (child_pid < 0) { perror("创建子进程失败"); return EXIT_FAILURE; } else if (child_pid == 0) { // 子进程:执行sudo提权命令 close(pipe_fd[1]); // 关闭管道写端 // 将标准输入绑定到管道读端,让sudo从管道读取密码 dup2(pipe_fd[0], STDIN_FILENO); close(pipe_fd[0]); // 构造sudo执行参数 char x_str[16]; snprintf(x_str, sizeof(x_str), "%d", x); // 注意路径要根据你的read_magic可执行文件位置调整 execlp("sudo", "sudo", "-S", "./read_magic", x_str, NULL); perror("启动sudo失败"); exit(EXIT_FAILURE); } else { // 父进程:向管道写入root密码 close(pipe_fd[0]); // 关闭管道读端 // 写入密码+换行符,模拟用户输入密码后按回车的操作 write(pipe_fd[1], input_root_pass, strlen(input_root_pass)); write(pipe_fd[1], "\n", 1); close(pipe_fd[1]); // 等待子进程执行完成,获取返回值 int wait_status; waitpid(child_pid, &wait_status, 0); int func_ret = WEXITSTATUS(wait_status); printf("read_magic_file执行结果:%d\n", func_ret); } return EXIT_SUCCESS; }
注意事项
- 如果
read_magic_file逻辑简单,不需要单独拆分可执行文件,也可以直接通过sudo sh -c "高权限命令"的方式执行,减少拆分工作量 - 进程退出码的取值范围为0~255,如果你的
read_magic_file返回值超出该范围,可以让子进程将结果打印到标准输出,父进程额外创建管道读取子进程的标准输出即可获取完整返回值 - 密码全程在内存管道中传递,不会写入磁盘,避免密码泄露风险
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

