2017-05-03 17 views
3

나는 리눅스 X86_64에 종사하고있다.PLT 스터브의 주소를 찾으십시오

항목이 나타내는 동적 함수의 이름이 지정된 ELF 파일에서 특정 PLT 항목의 주소를 결정해야합니다. 주소에서 파일 오프셋을 알아낼 수는 있지만 주소를 결정할 수 있어야합니다.

을 사용하여 ELF 파일을 분해하면 objdump가 PLT의 각 항목에 대해 기호 이름을 사용한다는 것을 알 수 있습니다. (어디에서이 주소와 기호 이름 사이의 관계를 얻을 수 objdump를합니까?)

예 :

0000000000000041a2b0 [email protected]: 

내가 objdump -T elffile | grep fileno를 사용하는 경우 나는 이런 식으로 뭔가를 얻을 : 내가 필요가있는 무엇

0000000000000 DF *UND* 00000000000000000 GLIBC_2.2.5 fileno 

"C"에서 할 수있는 일은 특정 동적 함수에 대한 ELF 파일에서 PLT 항목을 찾아 주소를 얻는 것입니다.

배경은 기존 ELF 파일에 패치를 적용하고 있으며 함수 호출을 다른 동적 함수로 리디렉션해야한다는 것입니다. objdump 디스 어셈블리에서 수집 한 주소를 사용하여 ELF 파일을 수동으로 패치하고 이것이 특정 응용 프로그램에서 작동한다는 것을 증명했습니다. 프로그램에서이 작업을 수행 할 수 있어야합니다. objdump 디스 어셈블러 코드를 통해 크롤링하지 않아도 PLT 항목 기호 및 주소를 가져 오는 방법을 파악할 수 있기를 바랍니다.

답변

1

나는 이것을 알아 냈습니다 : rela.plt 섹션에서 재배치 테이블을 구문 분석해야합니다. 이러한 항목에는 동적 기호 섹션으로 인덱싱하여 함수 이름을 조회하는 데 사용할 수있는 문자열 테이블 인덱스가 포함되어 있습니다. 동적 기호 섹션의 각 항목에는 함수 이름을 추출하는 데 사용할 수있는 동적 문자열 테이블 오프셋이 포함되어 있습니다. 해당 기능을 찾으면 재배치 테이블 (+1)에 대한 색인은 기능 PLT 항목에 대한 .plt 섹션에 대한 색인에 해당합니다. 따라서 특정 항목의 주소를 계산하는 것은 다음과 같습니다. .plt.sec address + ((relocation_index + 1) * .plt 항목 크기)

이 방법은 x86에서 작동합니다. .plt 섹션과 완전히 다른 형식의 PPC에는 작동하지 않습니다. 누구든지 PPC를 위해이 작업을 수행하는 데 필요한 정보가 있으면 게시하십시오.

+0

i386의 경우 PLT 항목 크기가 올바르게보고되지 않습니다. 보고 된 plt 항목 크기에 4를 곱하거나 항목 크기에 16을 사용할 수 있습니다. – codemonkey