Можно ли пропустить системные вызовы, сделанные динамическим загрузчиком в strace?

Существует также программа html2ps, с помощью которой можно легко преобразовать файл PostScript в формат pdf. Я использовал это несколько лет назад, и IIRC неплохо справился с большим руководством.

11
12.09.2021, 16:52
1 ответ

На x86 _64 основная программа запускается сразу после arch_prctl(ARCH_SET_FS)и пары mprotect()с, так что вы можете sed 1,/ARCH_SET_FS/dна выходе strace.

Уловка, которую вы можете использовать на всех платформах, заключается в LD_PRELOADнебольшой библиотеке, которая переопределяет __libc_start_main()и выполняет бессмысленный системный вызов, например write(-1, "IT_STARTS_HERE", 14), перед вызовом исходного __libc_start_main().

cat >hack.c <<'EOT'
#define _GNU_SOURCE
#include <dlfcn.h>
#include <unistd.h>
#include <errno.h>
#include <err.h>
int __libc_start_main(
        int (*main)(int,char**,char**), int ac, char **av,
        int (*init)(int,char**,char**), void (*fini)(void),
        void (*rtld_fini)(void), void *stack_end)
{
        typeof(__libc_start_main) *next = dlsym(RTLD_NEXT, "__libc_start_main");
        write(-1, "IT_STARTS_HERE", 14); errno = 0;
        return next(main, ac, av, init, fini, rtld_fini, stack_end);
}
EOT
cc -shared -ldl hack.c -o hack.so

hack_strace(){ strace -E LD_PRELOAD=./hack.so "$@" 2>&1 >&3 3>&- | sed 1,/IT_STARTS_HERE/d >&2; } 3>&1

# usage
hack_strace sh -c 'echo LOL'
getuid()                                = 2000
getgid()                                = 2000
getpid()                                = 11443
rt_sigaction(SIGCHLD, {sa_handler=0x55eba5c19380, sa_mask=~[RTMIN RT_1], sa_flags=SA_RESTORER, sa_restorer=0x7fae5c55f840}, NULL, 8) = 0
geteuid()                               = 2000
11
12.09.2021, 18:35

Теги

Похожие вопросы