저는 elf 파일을 가지고 있는데, 실행 파일에 변수 (문자열)가 사용되는 정보를 얻을 수 있는지 알고 싶습니다.ELF 파일 - 문자열이 사용되는 곳의 함수를 얻습니다.
.elf의 문자열을 인쇄하면 흥미로운 문자열을 발견하고 어떤 기능을 사용하고 있는지 알고 싶습니다. 어떻게 든 가능합니까?
감사합니다.
저는 elf 파일을 가지고 있는데, 실행 파일에 변수 (문자열)가 사용되는 정보를 얻을 수 있는지 알고 싶습니다.ELF 파일 - 문자열이 사용되는 곳의 함수를 얻습니다.
.elf의 문자열을 인쇄하면 흥미로운 문자열을 발견하고 어떤 기능을 사용하고 있는지 알고 싶습니다. 어떻게 든 가능합니까?
감사합니다.
는 이제 다음의 예를 살펴 보자 :
TEST.C
#include <stdlib.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
char *str_a = "a";
char *str_abc = "abc";
printf("%s\n", str_a);
printf("%s\n", str_abc);
exit(EXIT_SUCCESS);
}
이의 그것을 컴파일하자 gcc -Wall -pedantic-errors -o ~/test ~/test.c
합니다.
그러면 test
이라는 파일이 생성됩니다.
.rodata
섹션을 살펴 보겠습니다. readelf -x .rodata ./test
다음
이 출력된다 :
Hex dump of section '.rodata':
0x00400610 01000200 61006162 6300 ....a.abc.
출발 0x00400610
주소가 표시된다. 네 개의 도트가 첫 번째 문자열 상수 앞에 표시되므로 a
문자열의 주소는 0x00400614
이됩니다. a
및 null 바이트 (구분 기호)를 건너 뛰면 바이트가 건너 뜁니다. abc
의 주소는 0x00400616
이됩니다. 그래서이 시점에서 두 주소가 알려져 있습니다.
다음으로 objdump -M intel -d ./test
을 실행 해 봅시다.
0000000000400546 <main>:
400546: 55 push rbp
400547: 48 89 e5 mov rbp,rsp
40054a: 48 83 ec 20 sub rsp,0x20
40054e: 89 7d ec mov DWORD PTR [rbp-0x14],edi
400551: 48 89 75 e0 mov QWORD PTR [rbp-0x20],rsi
400555: 48 c7 45 f8 14 06 40 mov QWORD PTR [rbp-0x8],0x400614
40055c: 00
40055d: 48 c7 45 f0 16 06 40 mov QWORD PTR [rbp-0x10],0x400616
400564: 00
400565: 48 8b 45 f8 mov rax,QWORD PTR [rbp-0x8]
400569: 48 89 c7 mov rdi,rax
40056c: e8 9f fe ff ff call 400410 <[email protected]>
400571: 48 8b 45 f0 mov rax,QWORD PTR [rbp-0x10]
400575: 48 89 c7 mov rdi,rax
400578: e8 93 fe ff ff call 400410 <[email protected]>
40057d: bf 00 00 00 00 mov edi,0x0
400582: e8 b9 fe ff ff call 400440 <[email protected]>
400587: 66 0f 1f 84 00 00 00 nop WORD PTR [rax+rax*1+0x0]
40058e: 00 00
그래서, 그것은 두 문자열이 화면에 넣어하는 방법을 목록에서 매우 분명하다 : 여기
는.text
섹션 내
main
의 목록입니다. 목록에는 위에서 찾은 두 개의 주소가 언급되어 있습니다 - 강조 표시되어 있습니다.
따라서 모두 .rodata
섹션을 검사하고 특정 문자열의 위치 주소를 찾은 다음 .text
섹션에있는 주소에 대해 grep하면됩니다.
좋은 답변입니다. 지금 내 문자열의 주소를 얻었습니다. 정상적으로 작동합니다. .text 섹션을 읽으려고하면 메모리에 대한 절대 참조가없는 것으로 보입니다. 출력 예 : 14045fc4 : 40 1e 00 18 bne cr7,14045fdc <_init + 0x19a4c> 그래서 예를 들어 알아야합니다. 주소 "_init"에 있습니다. 그러나 수천 개의 상대 주소가 있습니다. 이 참고 문헌을 통해 우아한 방법을 찾을 수 있습니까? – Manuel
이 파일을 훨씬 더 많이 파고 들기 때문에 이것이 불가능합니까? 가능하면 끝내고 싶은 것 : 기능의 위치를 찾으십시오. 함수의 인수를 가져옵니다. 프로그램에서 호출 된 인수를 읽고 결국 인수를 변경하여 다른 함수로 함수를 호출하십시오. 이것은 어쨌든 가능할 수 있습니까, 아니면 그냥 꿈입니까?)? – Manuel