objcopy/elfedit를 사용하여 elf 파일의 기호(버전)를 패치하세요.

objcopy/elfedit를 사용하여 elf 파일의 기호(버전)를 패치하세요.

컨텍스트는 다음과 같습니다. 내 OS에서 (이미)liba.so.v2함수의 기호 버전으로 문자열 "symbol_version-2"를 포함하는 "liba"입니다.functionX@version-2(내 경우에는 예를 들어@NCURSES6_5.0.19991023 새로 고침 존재하다objdump -T /readelf산출). 이거 새거 있어요바이너리_a다운로드해서 실행해보고 싶었습니다. 그러나 이는 이전 버전의 라이브러리에 의존하므로liba.so.v1, "symbol_version-1"과 같은 다양한 기호 버전 문자열이 포함되어 있습니다(제 경우에는wrefresh@NCURSES_5.0.19991023(빠진 "6"에 유의하세요).

노트:

  • 이러한 함수(모두)는 so 라이브러리에 존재하며 새 라이브러리는 다음과 같습니다.확립된ld.so를 통해 (사용법 확인 LD_DEBUG=libs ldd ./binary_a)
  • 불행히도 바이너리에는 "새" 기호에 대한 참조가 없습니다. 그렇지 않으면 바이너리를 16진수로 편집하고 조정하는 것이 쉬울 것입니다.vna_flags(아래 NewAppsOnOldGlibc 링크 참조)

내 질문은 다음과 같습니다

  1. 새 라이브러리에서 새 기호를 참조하는 등 바이너리를 패치하는 방법- 특수 도구(objcopy/elfedit, 기타...?) 또는 16진수 편집을 사용하세요. 후자의 경우 해시를 다시 계산하는 방법에 대한 단계별 조언이 필요합니다(필요한 경우 다음을 기반으로 함).협회필요한 것 같습니다). 디테일은 충분해 보이는데동적 테이블 해싱, 그러나 제공된 정보가 너무 복잡해서 내 사용 사례에서 실제로 사용할 수 없습니다.
  2. 왜?ld.so (여전히) 이전 lib.so 및 이전 기호에 대한 모든 참조를 16진수로 편집한 후에도 "버전을 찾을 수 없습니다"라고 불평합니까?ld.so의 캐시에 어떤 종류의 간섭이 있습니까?

모든 시도로 인해 파일을 패치한 후 ldd(실제로는 ld.so)가 새 기호 버전을 찾을 수 없다고 불평하게 되었습니다...

이상적인 해결책은 (재)컴파일을 피하는 것입니다(예:바이너리_a), 이전 링크에서처럼 "더미" 함수가 컴파일되지 않는 한 LD_PRELOADs 변수를 사용하지 마세요.

내가 시도한 것:

  • 내 시험에서는파헬프, 플래그가 있는 손상된 바이너리를 생성했습니다.--필요한 liba.so.v2를 삭제합니다.;사용patchelf --필요한 liba.so.v2 liba.so.v1을 교체합니다.파일의 "물리적" 레이아웃을 재정렬하지만(hexedit로 볼 때) 기호는 여전히 v2 so lib를 참조하므로 이 옵션이 예상대로 작동하는지 의심됩니다. 더 많은 정보를 추가하려면:이것패치로. 바이너리의 "재배열"이라고 불리는 것 같습니다patchelf - 디버깅 다른 줄 중에는 다음과 같습니다. shifting new PT_LOAD segment by %d bytes to work around a Linux kernel bug
  • 시험용꼬마 요정바이너리를 로드하는 중에 또 다른 오류가 발생했습니다. 내 앞에 오류가 있었던 것은 아니지만 다음과 같습니다.'elf 헤더 AMD64-x64가 인식되지 않습니다'
  • 다른 바이너리를 "16진수 편집"할 때 기호 버전은동일한문자열 길이(이 경우와 달리 버전 문자열 길이는 한 문자 차이가 있음) - 따라서 더 간단한 경우 - doLDD결과 바이너리는 여전히 "symbol_version-2"를 찾을 수 없다고 불평합니다. 새 항목("symbol_version-2")을 추가하고 싶습니다..dynstr테이블은 실행 가능하지 않습니다(즉, 바이너리를 디컴파일하지 않고는). 그렇죠? 이것이 가능하다면 나는 단순히vna_flags현장에서 Elfxx_Vino"이전" 기호에 해당하는 항목은 "symbol_version-2"인 이 새 문자열의 오프셋(.dynstr 테이블)입니다.기존 Glibc 위에 새로운 앱이 추가되었습니다.

다음 도움말 - (a) 변경소남lib.so.v2 파일(사용 patchelf --set-soname또는 유사) 내에서 (b) 이름을 바꿉니다.library.so.v2파일을 제출하다library.so.v1 (c) 버전명 수정(문자열)오직? 다시 묻게 됩니다: 어떻게 부정행위를 합니까?ld.so바이너리에 대한 수동 수정을 수락하시겠습니까?

도움을 주셔서 미리 감사드립니다!

관련 정보