Linux에서 바이너리가 어떻게 구축되는지 이해할 기회가 있습니까? (그리고/또는 다른 유닉스)
컴파일러, 버전, 시간, 플래그 등...
찾아봤는데 readelf
많이 찾을 수 없었지만 바이너리 코드/부분 등을 분석하는 다른 방법이 있을 수 있습니다.
추출하는 방법을 아시나요?
답변1
모든 경우에 적용되는 일률적인 접근 방식은 없지만 단 하나의 컴파일러에서 수행되는 작업을 검색하여 정보를 바탕으로 추측할 수 있습니다.
GCC는 가장 간단합니다. .comment
GCC 버전 문자열(런타임에 얻는 것과 동일한 문자열 gcc --version
)을 포함하는 섹션을 작성합니다. 표시하는 방법이 있는지는 모르겠지만 readelf
사용 objdump
방법은 다음과 같습니다.
objdump -s --section .comment /path/binary
방금 귀하의 질문의 나머지 부분을 무시했다는 것을 깨달았습니다. 플래그는 일반적으로 어디에도 저장되지 않습니다. 댓글 섹션에 표시될 가능성이 높지만 이런 경우는 본 적이 없습니다. 타임스탬프에 대한 위치는 COFF 헤더에 있지만 ELF에는 해당 위치가 없으므로 컴파일 시간도 사용할 수 없는 것으로 가정합니다.
답변2
어때요?
readelf -p .comment a.out
답변3
이 명령을 시도해 볼 수 있습니다 strings
. 그러면 많은 텍스트 출력이 생성됩니다. 검사를 통해 컴파일러를 추측할 수 있습니다.
pubuntu@pubuntu:~$ strings -a a.out |grep -i gcc
GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3
여기서 나는 그것이 그것으로 컴파일되었다는 것을 알고 있지만 gcc
언제든지 strings
출력을 파일로 리디렉션하고 확인할 수 있습니다.
라는 아주 좋은 유틸리티가 있습니다peid
Windows의 경우 Linux에서는 대안을 찾을 수 없습니다.
답변4
readelf
아니면 objdump
둘 다 할 수 있습니다.
.note.ABI-tag
gcc로 컴파일된 ELF 파일에는 및 섹션이 추가됩니다 .note.gnu.build-id
. 둘 다 다음을 통해 표시될 수 있습니다.
objdump -sj .note.ABI-tag ELFFILE
objdump -sj .note.gnu.build-id ELFFILE
옵션 "s"는 전체 내용을 표시한다는 의미이고, "j"는 부분 이름을 의미합니다. 이 스타일은 섹션의 16진수 콘텐츠를 가져옵니다.
이 명령은 readelf -n
ELFFILE의 사람이 읽을 수 있는 내용을 한 번 표시합니다. 옵션 'n'은 주석을 의미합니다. 당신이 좋아하는 것을 선택하십시오.
그런데 를 사용하면 objcopy
elf 파일에 자신만의 섹션을 추가할 수 있습니다.