Упражнение для определения поведения исходного кода с использованием strace - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть задание, где мне дают исполняемый файл Linux для x86, и я должен объяснить причину появления strace следующим образом.Вот что происходит, когда я запускаю strace -f в Ubuntu 16.04.5 в VirtualBox.

execve("./asg-myst", ["./asg-myst"], [/* 67 vars */]) = 0
uname({sysname="Linux", nodename="student-VirtualBox", ...}) = 0
brk(NULL)                               = 0x1191000
brk(0x11921c0)                          = 0x11921c0
arch_prctl(ARCH_SET_FS, 0x1191880)      = 0
readlink("/proc/self/exe", "/home/student/Desktop/asgUBUNTU"..., 4096) = 42
brk(0x11b31c0)                          = 0x11b31c0
brk(0x11b4000)                          = 0x11b4000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/etc/passwd", O_RDONLY)           = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2246, ...}) = 0
read(3, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 2246
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4), ...}) = 0
write(1, "csdae+", 6)                   = 6
getpid()                                = 3794
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x1191b50) = 3795
wait4(-1, strace: Process 3795 attached
 <unfinished ...>
[pid  3795] write(1, "795794=", 7)      = 7
[pid  3795] lseek(3, -2167, SEEK_CUR)   = 79
[pid  3795] exit_group(42)              = ?
[pid  3795] +++ exited with 42 +++
<... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 42}], 0, NULL) = 3795
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3795, si_uid=1000, si_status=42, si_utime=0, si_stime=0} ---
write(1, "42\n", 3)                     = 3
lseek(3, -2167, SEEK_CUR)               = -1 EINVAL (Invalid argument)
exit_group(0)                           = ?
+++ exited with 0 +++

Мое описание будет таким:

Родительский процесс вызывает системный вызов getpid (), затемродитель вызывает clone ().Это каким-то образом сохраняет значение getpid родительского процесса в дочерний процесс, при этом дочерний процесс не вызывает getpid () для возврата значения pid родительского процесса.Это видно по части кода, выполняемой с дополнительным флагом -f.

Поскольку программа всегда запускается как новый процесс, значение pid всегда меняется.Вывод на печать имеет шаблон из 6 цифр, который связан с изменяющимся значением pid, где 3 самые правые цифры соответствуют 3 самым правым цифрам getpid () родительского элемента, а 3 самые левые оставшиеся цифры - это самые правые 3 цифры.ранее +1.Например, для pid 3287 последние 3 цифры - 287, поэтому выводится 288287.

Дочерний процесс exit_group (42), который каким-то образом редактирует si_status, а родительский процесс печатает этот si_status перед выходомобычно.

Есть ли что-то, чего мне не хватает в моем анализе, я просто думаю, что это поток исключительно путем чтения вывода strace.

...