linux - 附加到 vsftpd 的 ptrace 挂起

标签 linux debugging ftp ptrace vsftpd

我正在尝试跟踪 linux 上的 vsftpd 服务器进程,以便在 vsftpd 进程进行系统调用时能够获得控制权。我启动 vsftpd 进程并将此进程 ID 作为命令行传递给跟踪 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;
}

最佳答案

您需要有权限才能跟踪 VSFTPD。以 root 身份运行它。为了测试,将 ptrace(PTRACE_ATTACH,child,NULL,NULL); 的结果放入一个变量中并打印出来,即。

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

在我的系统上,如果结果 == -1,我没有权限。如果结果 == 0,我会。

关于linux - 附加到 vsftpd 的 ptrace 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5386307/

相关文章:

linux - 如何通过键盘快捷键选择交换剪贴板内容

linux - Docker RUN groupadd && useradd 指令无效

linux - F#、Linux 和 makefile

visual-studio - 被调试的进程究竟如何危害调试进程(机器)?

objective-c - 为什么 Xcode 的调试器在使用 Swift 时会这样跳来跳去?

python - 如何从ftp下载文件?

linux - 如何对指定目录的所有现有文件和新文件设置权限

linux - awk 在 linux 中子集化失败

objective-c - 如何在 xcode 中自动打印异常?

linux - 通过前端创建FTP账号