2017-01-06 18 views
0

thesequestions을 읽은 후 심볼 해상도 순서를 제어하는 ​​방법에 대해 좀 더 자세히 알아 보려고합니다.동적으로로드 된 다른 객체에서 심볼을 다르게 해석하기

내 문제는 기본 실행 파일 exec입니다. execa.soc.so에 동적으로 연결됩니다. a.so은 (는) b.so에 동적으로 링크됩니다. b.so은 일반적으로 c.so에 의해 제공되는 foo 함수를 호출하지만이 경우에도 exec에 의해 제공됩니다. b.soc.so의 구현이 foo 인 경우에만 작동합니다.

상황의 다이어그램 :

exec  (foo caller and provider) 
    | \ 
a.so | 
    | | 
b.so | (foo caller) 
    |/
c.so  (foo provider) 

난 단지 a.so의 컴파일/소스를 제어 할 수 있습니다, 나는 LD_PRELOADexeca.so를 연결합니다.

나는의 구현 'c.so를 해결하기 위해 b.so에서의 구현 및 호출'exec에 해결하는 exec에서 foo에 전화를하고 싶습니다. 다른 객체에서 다른 심볼 검색이 가능한이 유형이 가능한가?

답변

0

불행히도 라이브러리 수준에서 심볼 해상도를 조정할 방법이 없으므로이를 달성하기위한 쉬운 방법이 없습니다. foo 만약

은 실제로 당신이 GOT의 궁극적 해키 런타임 패치와 확인하지 않는 한 주요 실행 파일에서 기호 (확인 중에 가장 높은 우선 순위를 얻을 수 있기 때문에 당신이 할 수있는 아무것도 없다 (다만 copy-relocated 그것에) 주요 실행 파일에 구현되는 너는 그렇지 않다).

그러나

  • foo는 c.so
  • 에서 구현되고 당신은 필사적으로 충분한 경우
다음을 수행 할 수

: 인터셉터 내부

  • GET 반환 주소를 a.so (사용 __builtin_return_address)
  • ,
  • 이 결과에 따라 (/proc/self/maps에서 얻을 수 있습니다) b.so의 경계에 대한
  • 경기를 중 RTLD_NEXT

이의 포워드 호출 (호출 측이 b.so에있는 경우) 또는 특수 처리를 할 물론 명백한 한계가있다. b.so 호출이 아직 또 다른 d.so에서 작동하면 작동하지 않고 foo을 호출하지만 많은 경우에 충분할 수 있습니다. 그리고 네, 저는이 접근 방식이 실제로 적용된 것을 보았습니다.

+0

"dlsym"으로 어떻게 할 수 있습니까? 나는''.so''가''dlsym ''으로''c'so'''foo''를 참조 할 수있는 방법을 보지만''dlsym''을 사용하여' 'b.so'는 그것을 사용합니까? –

+0

죄송합니다. 질문을 잘못 읽었습니다. 답변을 업데이트했습니다. 이제 도움이 되었기를 바랍니다. 편집을위한 – yugr

+0

감사합니다! 그러나 모든 종속성은 다이어그램에서 아래로 내려갈뿐입니다 (''a.so''는''b.''__builtin_return_address'' 트릭이 작동하지 않음을 의미합니다. 또한 실제로는''exec''와''c.so''에''foo''를 구현 한 것입니다. GOT 해킹에 대한 리소스가 있습니까? (제가 가고 싶은 길이 아니지만 배울 점이 있습니다)? –