2011-03-22 54 views
0

我試圖在Linux上執行vsftpd服務器進程,以便在vsftpd進程進行系統調用時能夠獲得控制權。我啓動vsftpd進程,並將此進程ID作爲命令行傳遞給跟蹤vsftpd的以下程序。但是,當我運行下面的程序時,它只是掛起,並沒有打印任何東西。任何人都可以指出什麼可能是錯誤的?非常感謝你的幫助!!ptrace附加到vsftpd掛起

#include <sys/ptrace.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <linux/user.h> 
#include <sys/syscall.h> /* For SYS_write etc */ 
#include<sys/reg.h> 
int main(int argc,char* argv[]) 
{ pid_t child; 
long orig_eax, eax; 
long params[3]; 
int status; 
int insyscall = 0; 
child = atoi(argv[1]); 
ptrace(PTRACE_ATTACH,child,NULL,NULL); 
    while(1) { 
     wait(&status); 
     if(WIFEXITED(status)) 
      break; 
     orig_eax = ptrace(PTRACE_PEEKUSER, 
       child, 4 * ORIG_EAX, NULL); 

    if(orig_eax == __NR_clone || orig_eax == __NR_open || orig_eax == __NR_write) 
     { 
if(insyscall == 0) { 
      /* Syscall entry */ 
      insyscall = 1; 
      params[0] = ptrace(PTRACE_PEEKUSER, 
           child, 4 * EBX, 
           NULL); 
      params[1] = ptrace(PTRACE_PEEKUSER, 
           child, 4 * ECX, 
           NULL); 
      params[2] = ptrace(PTRACE_PEEKUSER, 
           child, 4 * EDX, 
           NULL); 
    if(orig_eax == __NR_clone) 
    { 
     printf("\nClone"); 
    } 
    else if(orig_eax == __NR_open) 
     printf("\nOpen"); 
    else if(orig_eax == __NR_write) 
     printf("\nWrite"); 
      printf(" called with " 
        "%ld, %ld, %ld\n", 
        params[0], params[1], 
        params[2]); 
      } 
     else { /* Syscall exit */ 
      eax = ptrace(PTRACE_PEEKUSER, 
         child, 4 * EAX, NULL); 
       printf("Returned " 
         "with %ld\n", eax); 
       insyscall = 0; 
      } 
     } 
     ptrace(PTRACE_SYSCALL, 
       child, NULL, NULL); 
    } 

return 0; 
} 
+0

爲什麼不添加一些臨時printf狀態語句?然後,你將能夠看到它掛在哪裏,然後開發關於它爲什麼懸掛的理論會更容易。你確定等待(&狀態)在做你的想法嗎?祝你好運! – shellter 2011-03-25 11:15:01

回答

2

您需要有權跟蹤VSFTPD。以root身份運行。爲了測試,將ptrace(PTRACE_ATTACH,child,NULL,NULL);的結果放入一個變量並打印出來,即。

long result = ptrace(PTRACE_ATTACH,child,NULL,NULL); 
printf("%ld",result); 

在我的系統上如果結果== -1,我沒有權限。如果結果== 0,我願意。

+0

如果結果<0,我建議調用'perror' – 2016-01-26 05:59:11