Различать интерпретаторы для execve() в последовательности системных вызовов в Linux

Как узнать, какой интерпретатор он использует, когда execve() выполняет файл в Debian Linux, из журналов системных вызовов strace?

Например, как узнать, что файл выполняется как скрипт bash (#!/bin/bash), скрипт python (#!/usr/bin/env python) или чистый файл ELF?

Предположим, что у нас нет правильного суффикса файла, поэтому мы не можем просто сказать это по аргументам execve().

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


person I Wonder    schedule 28.08.2018    source источник


Ответы (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
person KamilCuk    schedule 28.08.2018