用GNU ASM在X64中执行参数
我试图在linux中编写一个gnu asm中的shellcode,但我无法用参数调用execve. 我要做的事情: execve("/bin/ls", ["/bin/ls", "-la", NULL], NULL); 这是我的代码: .section .text .globl _start _start: push $0x3b pop %rax xorq %rdx,%rdx push %rdx movabs $0x61616161616c2d2d,%r8 shr $0x8, %r8 push %r8 movabs $0x736c2f6e69622f2f,%r8 shr $0x8, %r8 push %r8 mov %rsp, %rdi push %rdx push %rdi m
6 2023-12-16
编程技术问答社区
如何使用execv()而不发出警告?
我正在使用GCC 4.2的MacOS-X狮子进行工作.此代码有效,但是我会得到一个警告,我想解决: #include main() { char *args[] = {"/bin/ls", "-r", "-t", "-l", (char *) 0 }; execv("/bin/ls", args); } 警告:弃用从字符串常数到'char*' 的弃用转换 我不希望警告被抑制,我根本不希望有警告. 它是C ++代码,而不是C. 使用char *const(因此,execv()所需的类型仍然会产生警告. 谢谢. 解决方案 这似乎还可以: #include main() { char const *args[] = {"/bin/ls", "-r", "-t", "-l", NULL }; execv("/bin/ls", const_cast(args)); }
6 2023-11-27
编程技术问答社区
使用execv(C语言)在linux命令提示符下运行命令
到目前为止,我唯一混淆的部分是如何将第一个参数作为当前工作目录设置Execv.我尝试了"".和"〜",屏幕上都没有执行任何操作;对于"/."也一样和"/〜".我对如何使Execv运行这样的操作感到困惑: $ ./prog ls -t -al 并在程序执行后执行命令(将其存储到argv中)或与文件所在的目录相同(根据谁在使用该文件而变化.) 我的代码: #include #include #include #include void main(int argc, char *argv[]) { int pid; int count = 0; char *argv2[argc+1]; for(count = 0; count
6 2023-11-08
编程技术问答社区
C的execv()函数是否终止了子程序?
这是我的代码的故障. 我有一个程序,可以分叉一个孩子(并在文件中记录孩子的pid),然后做自己的事情.孩子成为程序员与ARGV端庄的任何程序.当孩子完成执行后,它会将信号(使用Sigusr1)发送回父进程,因此父母知道将孩子从文件中删除.父母应停止一秒钟,通过更新其表格来确认已删除的条目,然后继续其停止的位置. pid = fork(); switch(pid){ case -1:{ exit(1); } case 0 :{ (*table[numP-1]).pid = getpid(); //Global that stores pids add(); //saves table into a text file freeT(table); //Frees table execv(argv[3], &argv[4]); /
6 2023-10-12
编程技术问答社区
从子进程向父进程发送消息
我正在执行父代码.然后,我做一个叉子,然后执行execvpe.我" execvpe"的新程序会抛出许多控制台消息,我想隐藏这些消息. 我是否有可能将我所有的Stdout和stderr消息重定向到文件? ? 我尝试了一个关闭(1),以免在控制台(stdout)上转储消息,但没有帮助 解决方案 pid_t pid = fork(); /* Child process */ if (pid == 0) { /* Open log file */ int log = creat("logfile", 0644); /* Redirect stdout to log file */ close(1); dup(log); /* Redirect stderr to log file */ close(2); dup(log); /* Execute other program: its stdout & st
12 2023-09-29
编程技术问答社区
如何通过使用os.execv()来继承python中的stdin和stdout
首先,我编写了C ++代码如下: #include int main() { int a,b; while(scanf("%d %d",&a,&b) == 2) printf("%d\n",a+b); return 0; } 我使用g++ -o a a.cpp来补充它. 之后,我编写了Python代码,如下所示: import os,sys sys.stdin = open("./data.in","r") sys.stdout = open("./data.out","w") pid = os.fork() if pid == 0: cmd = ["./a","./a"] os.execv(cmd[0],cmd) 但是,data.out文件一无所有.也就是说,孩子的过程并未从他的父母过程中继承stdin和Stdout.但是当我编写C ++代码如下: #include
14 2023-09-29
编程技术问答社区
将execvp的输出重定向到C语言的一个文件中。
我不知道我在做什么错...但是这是正在执行的代码段: if (fork() == 0) { // child int fd = open(fileName, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); dup2(fd, 1); // make stdout go to file execvp("ls","ls"); close(fd); exit(0); } if(wait(&status) == -1) { printf("ERROR REDIRECT\n"); } fileName被创建,但里面没有什么.我做错了什么? 解决方案 我的猜测是execvp不起作用,但是由于您不处理错误,因此看不到它. 尝试以下操作: char *const ar
42 2023-08-03
编程技术问答社区
指针失去其价值+execv编译警告
我希望我没有错过类似的问题. 我正在尝试使用原始C函数编码自己的迷你壳. 我得到了应该有效的东西,但是我有一个指针,可以使一切变得错误. 我的adrCmd指针应从searchCmd()函数中获取命令路径字符串,并在main函数中保留相同的值. 实际上:它指向searchCmd()上的正确值,但在main()中不指向. 这是代码: int searchCmd(char* cmd, char* adrCmd){ char* path = getenv("PATH"); if(debug)printf("PATH : %s\n", path); int nbPath = (compteLettre(path, ':')+1); char** pathTab = malloc(nbPath*sizeof(char*)); decompose(path, pathTab, 2048, ':'); int
8 2023-06-09
编程技术问答社区
prctl(PR_SET_PDEATHSIG, SIGNAL)是在父线程退出时调用,而不是在父进程退出时调用。
我有一个正在朝儿童过程分配的过程. 如果存在父过程,则不应存在子过程. 所以,我在子过程中致电::prctl(PR_SET_PDEATHSIG, SIGKILL)如果父母死亡,请杀死它. 最终发生的是父程线程调用pthread_exit,该线程最终成为杀死子过程的催化剂. 这是我的代码: parent.cpp: #include #include #include #include #include void* run(void* ptr) { std::cout
30 2023-04-06
编程技术问答社区
编写一个解释器或更像一个命令提示程序
我应该编写一个解释器程序,该程序更像是命令提示符.这是一些背景信息: General flow of basic interpreter 1. Prompt for user request. 2. Carry out the user request. 3. Unless user terminates the program, go to step 1. Run a command. Format: R command_path [arg1 to arg4] //a single character ‘R’ which stands for 'Run', followed by the path of the command //the user can supply up to 4 command line arguments Behavior: a. If command exist, run the command in a child process with the
24 2023-03-22
编程技术问答社区
Java程序在调用JNI方法后终止
我正在使用jni调用本机C方法,但是我的Java程序在第一个方法调用后终止(退出代码0),并且未达到其余代码. 这是我的来源: exec.java: package libs; public class Exec { static { System.load(System.getProperty("user.dir")+"/bin/"+"libexec.so"); } public static native int execv(String pExecPath, String[] pArgs); } exec.c: #include #include #include #include JNIEXPORT jint JNICALL Java_libs_Exec_execv(JNIEnv * env, jclass clazz, js
10 2023-03-09
编程技术问答社区
Linux下的printf不工作
我正在尝试使用此C代码运行可执行文件: int main(int argc, char *argv[]) { printf("hello.\n"); sleep(2); if (execlp("ls","ls","-l",NULL) == -1) printf("Error occured during execute ls.\n"); return 0; } 为什么printf(" Hello \ n") 不起作用?即使我睡觉了? 解决方案 输出到终端时,您的程序应起作用,但是如果将输出重定向到文件或管道,则该程序将无法正常工作.当stdout未连接到终端时,其输出将完全缓冲.在用新程序替换当前过程之前,调用exec函数不会冲洗缓冲区,因此任何缓冲输出都会丢失. 呼叫fflush(stdout);在呼叫execlp()之前,应解决问题.您不需要睡觉,对输出没有影响. #include
26 2023-03-08
编程技术问答社区
如何将一个在后台运行的子进程带到前台
如果我使用fork()和execv()产生了几个在后台运行的子进程,我想把其中一个带到前景,我该怎么做? 我试图写一个可以在前景或背景中启动进程的外壳. 解决方案 "背景"和"前景"不是一般使用的术语,而是适用于可以按需等待工作的外壳. 其他解决方案 a Ignacio Vazquez-Abram的答案,我建议您模仿Shell前景/背景模型. 据我所知,背景过程意味着将其暂停.最简单的方法是通过SIGSTOP.当您预先一个过程时,将其发送SIGCONT.只要您目前只有一个"工作",它将是唯一一本阅读和写入会议的tty. . kill(child_pid, SIGSTOP); kill(child_pid, SIGCONT); 您可能需要在fork之后和execv之前暂停每个过程,并给外壳的用户选择以后将它们预留以保持不变性. if (!fork()) { // we are the child raise(SIGSTOP); // suspe
22 2023-03-08
编程技术问答社区
拴马桩阻断儿童
我有一个问题,我想做一个叉子,例如一个20个程序的叉子,这个叉子创建了,直到没有创建最后一个叉子,我想用信号量使用它,我该怎么办实施? for (i=0; i #include #include #include #include int main() {
10 2023-02-04
编程技术问答社区
如何将重定向操作符'>'作为execv的参数传递?
在Linux终端中,我可以键入 echo hello! > /path/to/file 我认为我可以使用execv做同样的事情: #include #include #include int main(void){ char *write_cmd[] = { "echo", "hello!", ">", "/path/to/file", NULL}; if (fork() == 0){ execv("/bin/echo", write_cmd); } else{ sleep(1); } return 0; } 但是,此代码不会写"你好!"到文件,这是我想要的.是否有另一种方法可以使用Execv和Echo? 编辑: 我也尝试使用DUP2作为解决方案: #包括 #包括 #include int main(void){
34 2023-02-03
编程技术问答社区
如何让gdb跟随execv?尽管有 "follow-exec-mode",但还是不工作
我写了两个简单的程序: int main(int ac, char **argv ) { execv( "/home/me/Desktop/execvtest2", argv ); } 和 int main(int ac, char **argv ) { execv( "/home/me/Desktop/execvtest1", argv ); } 我已经编译了它们 gcc -g到根据输出文件. 我正在使用GCC(Ubuntu/Linaro 4.4.4-14ubuntu5.1)4.4.5. 运行Ubuntu 10.10. 当我使用GNU GDB(GDB)7.2-ubuntu调试第一个程序时,我可以踩到第一个Execv语句,但是两个文件才继续运行.即使我将后续模式设置为New,我也无法进入第二个程序. 当我设置catch exec时,GDB在每个呼叫中​​都停止(某些没有链接的第二个程序的链接源,我无法戒烟,因为它挂起了!?),但我无法逐步拨打"
94 2023-02-03
编程技术问答社区
fork() kill() 和 execv()
我在这里尝试一个小型单位测试.但是该程序无法正常工作. char *args[2]; args[0] = (char*)"/usr/bin/firefox"; args[1] = NULL; pid = fork(); printf("forked and my pid is %d\n",pid); //check for errors if (pid
12 2022-10-01
编程技术问答社区
execv如何从管道中获得输出?
指的是旧的作业问题: / *实施“的/ usr / bin中/ PS -ef |在/ usr /斌/更多的”* / 使用管道。 的#include<&stdio.h中GT; #包括LT&;&unistd.h中GT; #包括LT&;&stdlib.h中GT;诠释的main() { INT FDS [2]; INT孩子[2]; 的char * argv的[3]; 管(FDS); 如果(叉()== 0){ 关闭(FDS [1]); 关闭(STDIN_FILENO); DUP(FDS [0]); / *标准输入重定向到FDS [1] * / 的argv [0] =“/斌/多”; 的argv [1] = NULL; / *检查argv数组是如何设置的* / execv(的argv [0],argv的); //这里execv从标准输入如何读取? 出口(0); } 如果(叉()== 0){ 关闭(FDS [0
1426 2022-07-19
编程技术问答社区