Различают интерпретаторы для execve() в последовательности syscall в Linux
Как узнать, какой интерпретатор он использует, когда execve() выполняет файл в Debian Linux, из его системных журналов strace?
Например, как узнать, что файл выполняется как скрипт bash (#!/ Bin/bash), или как скрипт python (#!/ Usr/bin/env python), или как чистый файл ELF?
Предположим, у нас нет правильного суффикса файла, поэтому мы не можем просто узнать из аргументов execve().
Если он не может быть извлечен из журналов системных вызовов strace, какие еще методы можно использовать?
1 ответ
Используйте файл для этого:
$ echo '#!/bin/python' > 1
$ file 1
1: a /bin/python script, ASCII text executable
$ echo '#!/bin/sh' > 2
$ file 2
2: POSIX shell script, ASCII text executable
$ echo '#!/usr/bin/env python' > 3
$ file 3
3: Python script, ASCII text executable
$ echo 'int main() { return 0; } ' | gcc -xc -o4 -
$ file 4
4: ELF 64-bit LSB pie executable x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=d2f65ad2fe7b73bd5f4acc9fc9da25f748fe9915, not stripped