objdump elf 바이너리를 분해하는 방법

objdump elf 바이너리를 분해하는 방법

빠른 질문이 있습니다. 다음 코드를 사용하여 AC 코드에서 ELF 바이너리를 생성했습니다.

gcc -o simple simple.c

그런 다음 ELF 바이너리에 대해 objdump를 수행했습니다.

objdump --disassemble-all simple

내 디렉토리를 확인했는데 ls -a거기에 .o 파일이 없습니다. 내 질문은 objdump전체 분해 코드를 표시하는 방법입니다 . objdump모든 코드를 포괄하기 위해 바이너리에서 정적 분석이 수행됩니까 ?

답변1

objdump디스어셈블리 코드가 그 역할을 하기 때문에 보여주세요. 실행 파일의 형식을 알고 있습니다. 실행 파일은 단순한 명령의 직접적인 순서가 아니라 구조를 가지고 있습니다. 실행 파일은 일반적으로 다양한 메타데이터가 포함된 헤더로 시작하고 섹션으로 구성됩니다. 동적으로 링크된 실행 파일에는 동적 링커가 요구하는 충분한 정보가 포함되어 있어야 합니다. 따라서 실행 파일에 필요한 기호와 해당 기호가 로드될 위치를 표시하여 프로그램이 실행될 때 해당 기호를 찾을 수 있도록 해야 합니다.

예를 들어 대부분의 Unix 시스템에서는 다음을 사용합니다.매우 낮은 주파수(다른 형식도 존재합니다). objdumpELF 바이너리가 감지된 경우 (확인하여)매직넘버파일 시작 부분에서) 구문 분석합니다.파일 헤더, 프로그램 헤더와 섹션 테이블의 위치를 ​​알 수 있습니다. 각 섹션에는 포함된 콘텐츠 유형에 대한 표시가 포함되어 있습니다. objdump각 섹션은 해당 유형에 따라 추가로 구문 분석됩니다. 코드가 포함되어야 하는 섹션을 발견하면 해당 섹션에 대해 디스어셈블러를 실행합니다.

디스어셈블리는 원칙적으로 매우 간단합니다. 코드는 명령어 목록이고 디스어셈블리는 단순히 명령어의 이진 표현을 텍스트 표현으로 변환합니다. 디스어셈블러는 명령을 순서대로 가져옵니다. 실제로 다양한 명령어 크기를 가진 아키텍처에서는 데이터가 코드 세그먼트에 포함될 수 있기 때문에 상황이 더 복잡해질 수 있습니다. objdump일반적으로 "일반" 실행 파일에서 작동하지만 의도적으로 난독화된 바이너리에서는 합리적인 출력을 생성하지 못할 수 있습니다.

objdump정적 분석은 수행되지 않습니다. 명령어의 의미를 분석하지 않고 직접 구문 분석 및 번역만 수행합니다.

답변2

objdump "GNU 유틸리티"는 선형 스캔 방법을 사용하여 개체(실행 파일도 포함)를 분해하는 도구입니다. 이는 파일을 선형적으로 구문 분석하고 각 명령을 정적 방식으로 디코딩한다는 것을 의미합니다. 그러나 심각한 한계가 있습니다. objdump는 코드의 코드와 데이터 바이트를 구별할 수 없습니다. 예를 들어 패딩 바이트를 디코딩하는 데 이상적인 규칙이 없습니다.

Objdump는 일반적으로 프로그램의 진입점(ELF 헤더에 있음)에서 시작하여 명령을 선형적으로 디코딩합니다. 아래는 선형 스캔 알고리즘입니다.

여기에 이미지 설명을 입력하세요.

관련 정보