ptrace%edx表示sys_open不一致

时间:2011-03-30 16:38:34

标签: linux x86 system-calls ptrace

我正在尝试使用ptrace从sys_open系统调用中获取文件名。我得到了文件路径指针,我能够从该地址获取正确的数据,但是,我需要一种方法来了解要获取多少数据,即文件名的长度。我认为这个值应该是edx,但这似乎不是这里的情况。有什么想法吗?

        orig_eax = ptrace(PTRACE_PEEKUSER, child, 4 * ORIG_EAX, NULL);
        if(orig_eax == __NR_open){
            ptrace(PTRACE_GETREGS, child, NULL, &regs);
            if(regs.eax > 0){                    
                filepath = (char *)calloc((regs.edx+1), sizeof(char));
                getdata(child, regs.ebx, filepath, regs.edx);

                printf("Open eax %ld ebx %ld ecx %ld filepath %s\n",regs.eax, regs.ebx, regs.ecx, filepath);

                free(filepath);
            }
        } 

示例输出:

Open eax 3 ebx 2953895 edx 438 filepath /etc/localtime
Open eax 3 ebx 143028320 edx 384 filepath /var/log/vsftpd.log
Open eax 4 ebx 2957879 edx 438 filepath /etc/nsswitch.conf
Segmentation Fault

只是edx:

edx 438
edx 384
edx 438
//seg fault here
edx -1217013808
edx 0
edx 143035796
edx 0
edx 0

1 个答案:

答案 0 :(得分:3)

我总是想查看Linux System Call Table这样的情况,然后this page了解详情。

事实是,对于 sys_open %edx不会存储文件名的长度。它存储文件权限

知道文件名长度的唯一方法是之后检索文件名并将其传递给 strlen(),这将返回字符串的大小。