나는 책을 읽고 있습니다책ELF에 관한 이야기입니다. 이것이 실행 파일의 파일 형식이라는 것을 알고 있습니다. 가상 머신에서 명령을 실행했지만 그 기능을 이해할 수 없습니다.
objcopy -O binary -j .interp /bin/ls /dev/stdout
실행 후 파일을 열어 /dev/stdout
보니 일종의 로그 정보처럼 보이는데요.
답변1
Unix와 Linux SE에 오신 것을 환영합니다!
ELF 파일에는 하나 또는 두 개의 바이너리 헤더와 많은 명명된 섹션이 있습니다.관심이 있으시면 Wikipedia에 ELF 파일 구조에 대한 설명이 있습니다.
귀하의 명령은 objcopy -O binary -j .interp /bin/ls /dev/stdout
파일 부분의 내용을 그대로 "파일"로 출력합니다( )..interp
/bin/ls
-O binary
/dev/stdout
/dev/stdout
현재 프로세스(즉, 표준 출력 스트림)의 파일 설명자 #1을 가리키는 심볼릭 링크여야 합니다. 이는 기본적으로 출력을 지정된 파일에 기록하여 표준 출력을 사용하도록 프로그램에 지시하는 방법일 뿐입니다. 일부 프로그램에서는 출력 파일 이름을 just 로 지정하면 -
이 작업을 수행할 수 있지만 분명히 objcopy
해당 규칙을 따르지는 않습니다.
열 때 "어떤 종류의 로그 메시지"가 보인다면 /dev/stdout
아마도 심볼릭 링크가 루트로 실행되는 일부 프로그램이나 스크립트에 의해 실수로 대체되었다는 의미일 것입니다. 다음과 같아야 합니다.
$ ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 Nov 17 23:25 /dev/stdout -> /proc/self/fd/1
64비트 x86 시스템에서 objcopy
명령은 다음과 같이 출력되어야 합니다 /lib64/ld-linux-x86-64.so.2
. 출력의 끝에 개행 문자가 포함되지 않으므로 다음 명령 프롬프트와 같은 줄에 나타날 수 있으므로 찾기가 더 어렵습니다.
[my command prompt]$ objcopy -O binary -j .interp /bin/ls /dev/stdout
/lib64/ld-linux-x86-64.so.2[my command prompt]$
32비트 x86 바이너리에서 출력은 /lib/ld-linux.so.2
.
출력은 파일 이름입니다프로그램 통역사또한 ~으로 알려진동적 링커/로더검사된 바이너리와 함께 사용해야 합니다. 시스템에서 또는 명령을 사용하여 man ld.so
이에 대한 자세한 정보를 얻을 수 있습니다.man ld-linux