//ret = kill(traced_process, 0); //f(ret < 0){ // fprintf(stderr, "process does not exit\n"); // return -1; //num = atoi(argv[2]); num = 6666; ptrace(PTRACE_ATTACH, traced_process, NULL, NULL); while(1){ wait(&status); if(WIFEXITED(status)) break; orig_eax = ptrace(PTRACE_PEEKUSER, traced_process, 4*ORIG_EAX, NULL); //printf("the value of orig_eax is %ld\n", orig_eax); if(orig_eax == SYS_write){ if(insyscall == 0){ insyscall = 1; //ptrace(PTRACE_POKEUSER, traced_process, 4*EDI, num); ptrace(PTRACE_GETREGS, traced_process, NULL, ®s); regs.eax = num; ptrace(PTRACE_SETREGS, traced_process, NULL, ®s); printf("new value of eax is %ld\n", regs.eax); //cs,orig_eax, ss,无效 else{ insyscall = 0; ptrace(PTRACE_DETACH, traced_process, NULL, NULL); break; ptrace(PTRACE_SYSCALL, traced_process, NULL, NULL); return 0; }

对目标进程的栈进行故障注入:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/reg.h>
#include <linux/user.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
static void usage(FILE *stream)
    fprintf(stream, "Usage: register PID value\n");
int main(int argc, char *argv[])
    //int running = 1;
    int ret;
    pid_t traced_process;
    long orig_eax;
    long num;
    long long addr;
    int insyscall = 0;
    int status;
    key_t key;
    //printf("BUFSIZ: %d\n", BUFSIZ);
    if(argc < 2){
        usage(stdout);
        return -1;
    traced_process = atoi(argv[1]);
//  ret = kill(traced_process, 0);
//  if(ret < 0){
//      fprintf(stderr, "process does not exit\n");
//      return -1;
//  }
    //num = atoi(argv[2]);
    num = 88;
    //key = (key_t)traced_process;
    addr = (long long)atof(argv[2]); //进行故障注入的地址    
    printf("inject the fault of stack in address: %lld,  0x%x\n", addr, (unsigned int)addr);    
    ptrace(PTRACE_ATTACH, traced_process, NULL, NULL);
    while(1){
        wait(&status);
        if(WIFEXITED(status))
            break;
        orig_eax = ptrace(PTRACE_PEEKUSER, traced_process, 4*ORIG_EAX, NULL);
        if(orig_eax == SYS_write){
            if(insyscall == 0){
                insyscall = 1;
                ptrace(PTRACE_POKEDATA, traced_process, addr, num);
            else{               
                insyscall = 0;
                ptrace(PTRACE_DETACH, traced_process, NULL, NULL);
                break;
        ptrace(PTRACE_SYSCALL, traced_process, NULL, NULL);
    return 0;