ptrace% edx для sys_open не соответствует - PullRequest
1 голос
/ 30 марта 2011

Я пытаюсь получить имя файла из системного вызова sys_open, используя ptrace. Я получаю указатель пути к файлу и могу получить правильные данные с этого адреса, однако мне нужен способ узнать, сколько данных нужно получить, то есть длину имени файла. Я думал, что это значение должно быть в 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 Ответ

3 голосов
/ 30 марта 2011

Я всегда хотел бы проверить Таблицу системных вызовов Linux для подобных ситуаций, а затем эту страницу для более подробной информации.

Дело в том, что для sys_open , %edx не хранит длину имени файла. Он хранит права доступа к файлу .

Единственный способ узнать длину имени файла - это после , когда вы извлекаете имя файла и передаете его в strlen () , который возвращает размер строки.

...