Changeset 3320 for neercs


Ignore:
Timestamp:
Nov 8, 2008, 1:35:26 AM (11 years ago)
Author:
Pascal Terjan
Message:
  • Fix passing of env to execve syscall
File:
1 edited

Legend:

Unmodified
Added
Removed
  • neercs/trunk/src/mytrace.c

    r3044 r3320  
    330330#if defined USE_GRAB
    331331    struct user_regs_struct regs;
    332     char *env;
     332    char *env, *p;
     333    long p2, envaddr, argvaddr, envptraddr;
    333334    char envpath[PATH_MAX+1];
    334     ssize_t envsize = 32*1024;
    335     int ret, fd, l;
     335    ssize_t envsize = 16*1024;
     336    int ret, fd, l, l2;
     337    char *newargv[] = { NULL };
    336338    ssize_t r;
     339
     340    ptrace(PTRACE_SETOPTIONS, t->pid, NULL, PTRACE_O_TRACEEXEC);
    337341
    338342    if(ptrace(PTRACE_GETREGS, t->pid, NULL, &regs) < 0)
     
    342346    }
    343347
     348    debug("PTRACE_GETREGS done");
    344349    env = malloc(envsize);
    345350    if (!env)
     
    367372            return -1;
    368373    }
     374    envsize = r;
    369375    l = strlen(command)+1;
    370     memcpy_into_target(t, regs.RSP, command, l);
    371     memcpy_into_target(t, regs.RSP+l, env, envsize);
     376    l2 = sizeof(char *);
     377    p2 = regs.RSP;
     378    memcpy_into_target(t, p2, command, l);
     379    p2 += l;
     380    argvaddr = p2;
     381    memcpy_into_target(t, p2, (char *)&regs.RSP, l2);
     382    p2 += l2;
     383    memcpy_into_target(t, p2, (char *)&newargv, l2);
     384    p2 += l2;
     385    memcpy_into_target(t, p2, env, envsize);
     386    envaddr = p2;
     387    p2 += envsize;
     388    envptraddr = p2;
     389    p = env;
     390    while (p < env+envsize)
     391    {
     392        long diffp = p - env + envaddr;
     393        memcpy_into_target(t, p2, (char *)&diffp, l2);
     394        p2 += l2;
     395        p += strlen(p)+1;
     396    }
     397    memcpy_into_target(t, p2, (char *)&newargv, l2);
    372398    free(env);
    373     ret = remote_syscall(t, MYCALL_EXECVE, regs.RSP, 0, regs.RSP+l);
     399    ret = remote_syscall(t, MYCALL_EXECVE, regs.RSP, argvaddr, envptraddr);
    374400
    375401    if(ret < 0)
     
    479505    }
    480506
    481     debug("remote syscall %s(%lu, %lu, %lu)",
     507    debug("remote syscall %s(0x%lx, 0x%lx, 0x%lx)",
    482508          syscallnames[call], arg1, arg2, arg3);
    483 
    484     print_registers(t->pid);
    485509
    486510#if defined __x86_64__
     
    499523
    500524        oinst = ptrace(PTRACE_PEEKTEXT, t->pid, oldregs.RIP - 2, 0) & 0xffff;
    501         fprintf(stderr, "%lx\n", oinst);
    502525
    503526#if defined __x86_64__
     
    597620            /* The process is about to exit, don't do anything else */
    598621            return 0;
     622        case PTRACE_EVENT_EXEC:
     623            debug("PTRACE_EVENT_EXEC");
     624            return 0;
    599625        }
    600626
Note: See TracChangeset for help on using the changeset viewer.