1

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
4

1 に答える 1

3

私はいつもLinuxシステムコールテーブルでこのような状況をチェックし、次にこのページで詳細を確認するのが好きです。

実際のところ、sys_openの場合%edx、ファイル名の長さは保存されません。ファイルのアクセス許可を保存します。

ファイル名の長さを知る唯一の方法は、ファイル名取得してstrlen()に渡すことです。これにより、文字列のサイズが返されます。

于 2011-03-30T17:08:07.383 に答える