2011-04-23 6 views
0
8048563:  e8 0d 00 00 00   call 8048575 <[email protected]+0x141> 

재미있게 바이너리를 리버스 엔지니어링하려고했는데 objdump 출력에서이 호출을 보았습니다. 이 줄을 보면 동적으로 연결된 exit 함수에 대한 호출이라고 생각했습니다. 그러나 8048575은이 프로그램의 .text 섹션에있는 주소 인 것 같습니다!리버스 엔지니어링에 대한 의심

  1. 왜이 잘못된 함수 이름이 사용됩니까?
  2. 통화가 착륙하는 곳은 다음과 같습니다. 함수 프롤로그가 누락 된 이유는 무엇입니까?
8048575:  83 ec 6c    sub esp,0x6c 
+0

prog의 'text'섹션은 데이터가 아니라 코드입니다. 8048575 8048563에있는 호출 자체를 넘어서는 12 개의 위치 만 표시됩니다. 무엇이 누락 되었습니까? –

답변

3

실제로 IAT/PLT 호출이 아니며 동일한 파일에서 다른 함수를 호출하는 것입니다. 이 파일에는 내부 심볼이 제거 된 것이므로 objdump는 모든 주소를 주소 + 오프셋 앞에 마지막으로 정의 된 심볼로 표시합니다. 내부 기호가 없으면 plt 섹션이 텍스트보다 먼저 오기 때문에 마지막 plt 링크 함수에 도달합니다.

그래서 표시된 이름은 가짜이며 무시할 수 있습니다.

1

할당 스택 공간 없이, 함수 프롤로그입니까? 그게 exit 함수의 시작이 아니라는 것을 어떻게 알 수 있습니까? .text는 코드가 존재하기 때문에 완전히 괜찮습니다. (plt는 단지 "프로그램 목록 테이블"을 참조합니다.)

3

프로그램이 공유 라이브러리에서 함수를 호출하면 프로 시저 연결 테이블 (PLT)에서 주소를 호출합니다. 처음에 PLT에는 동적 링커에 대한 호출이 포함되어 있습니다. 동적 링커는 함수 주소를 동적으로 찾은 다음 PLT의 주소를 찾은 주소로 바꿉니다.

3

IAT (가져 오기 주소 테이블) 항목을 호출하여 '종료'라는 함수에 대한 상호 모드 호출 (실제로 점프)을 수행 할 수 있습니다. 이는 멀리 호출을 피하고 동적 연결을 간단하게 만듭니다. 프롤로그가 '누락 된'것에 관해서는, 스택 프레임의 셋업은 전혀 필요하지 않습니다. 실제로는 대부분의 기능에 대해 불필요합니다. 따라서 스택 할당 프롤로그입니다. 실제로 스택 프레임을 필요로하는 유일한 기능은 신뢰할 수 없습니다. naked '어셈블리 함수 나 스택에 예측할 수없는 변경을하는 함수가 있습니다.