0

나는 그래서 당신은 정적 실행 파일로 파일을 링크 할 때정적으로 링크 된 라이브러리 : 코드가 실행 파일의 연속 영역에 있는지 찾는 방법은 무엇입니까?

가 해당 파일의 내용이 링크시에 포함되어 있는지 답변 this 읽을. 즉, 파일 내용이 실행 파일에 물리적으로 삽입됩니다.

일반적으로이 코드가 인접한 영역에 있는지 궁금합니다. 나는 another에서 이렇게 대답했습니다. 항상 그렇지는 않을 것입니다.

이 가정은 단순한 경우에는 사실 일 수 있지만 결코 보장되지는 않습니다.

나는 바이너리와 소스 코드가 없다고합니다. 그러나 실행 파일은 정적으로 연결된 특정 라이브러리를 사용하여 빌드 된 것입니다.

  • 정적으로 링크 된 라이브러리의 코드가 실행 파일의 인접한 영역에 있는지 확인할 수 있습니까? 일반적인 경우 불가능한 경우 휴리스틱 또는 지표가 있습니까?
  • 왜 링커가 라이브러리의 코드를 실행 파일의 다른 위치에 배치합니까? 드문 경우가있을 것 같네요, 그렇죠?
+1

질문의 두 번째 링크는 두 번째 질문에 대한 대답 인 것 같습니다 (왜 링커가 코드를 재정렬합니까?). 일반적으로 요청하면 효율성을 위해 그렇게 할 것입니다. 일반적으로이 최적화를 수행하려면 링커에 대한 프로파일 링 정보를 제공해야합니다. '-freorder-functions'에 대한'gcc' 문서를 참조하십시오. – rici

답변

1

실행 파일을 분석하려면 디 컴파일 및 코드보기 도구를 사용할 수 있습니다. 여기에있는 사람들이 당신을 더 잘 도울 수 있습니다 : https://reverseengineering.stackexchange.com/

이유는이 영역을 주변을 이동하거나 크기가 적당한 구멍으로 나누기위한 최적화가 될 수 있습니다. 또 다른 주요한 이유는 도서관 공격으로의 이동을 막는 것입니다. 기본적으로 메모리에 대한 실행 보호는 공격자가 임의의 코드를 데이터 버퍼에 쓰고 실행시키는 것을 방지합니다. 이에 대응하기 위해 크래커는 때때로 라이브러리 코드에서 공격을 함께 끈으로써 라이브러리 위치가 무작위로 지정됩니다. 그게 네가하려는 일이 아니지, 그렇지?

+0

답변 해 주셔서 감사합니다. 라이브러리 코드가 인접한 영역에 있지 않을 수도있는 이유가 있습니다. 첫 번째 질문 (cont. 영역에 있는지 알아 보는 방법)에 관해서는 역 설계에 대한보다 정확한 질문을하려고 노력할 것입니다 .stackexchange.com – stackoverflowwww