반응형

라이브러리 함수를 실행하게되면 PLT영역에서 GOT로 점프하고 함수를 실행하게 되는데,

GOT는 어떻게 값을 넣어주는지 알아보자. ( 함수가 처음 실행 됐을 때 실행됌, 두 번째 실행부터 바로 GOT주소로 JMP함 )


먼저 알아둘게 있다.

FUNC::PLT + 0 은 jmp FUNC::GOT 로 점프,

FUNC::PLT + 6 은 push DATA,

FUNC::PLT + 11 에서 jmp를 하게되면 거기서 pushl, jmp가 있는 PLT시작부분으로 분기하게된다.


PLT시작부분에서 pushl로 GOT+4 주소를 스택에 넣고, jmp되는 부분에 GOT+8 주소를 넣게되는데,

GOT + 8 이 _dl_runtime_resolve 의 주소가 된다.


_dl_runtime_resolve를 분석해보면

_dl_fixup 이란 함수를 실행 edi, esi에 각각 함수의 offset값과 .strtab의 주소값이 들어간다.

예를 들어 puts함수를 실행하려면 먼저 puts함수의 puts 문자열을 얻어야한다. ( windows 에서 GetProcAddress와 같은 방식임 )

문자열을 얻기위해서는 _dl_finxup 실행 후 edi에 puts의 offset값, esi에 .strtab의 주소값이 들어가고, .strtab 주소 + puts::offset을 더해주면 된다.

그리고 eax에는 문자열 주소를 넣어주고, _dl_lookup_symbol_x라는 함수를 실행하게 된다.

_dl_lookup_symbol_x함수에서는 .syntab과 lib의 주소를 얻고 _dl_fixup함수에서 얻은 puts의 offset, .strtab주소를 이용해서

정확한 함수주소를 얻고 GOT에 쓴 뒤에 puts함수를 실행하게 된다.


호출 순서

_dl_runtime_resolve -> _dl_fixupup -> _dl_lookup_symbol_x -> Function

'공부' 카테고리의 다른 글

Template 공부  (0) 2016.02.09
[MSDN] Allocator  (0) 2016.02.02
MISC_Nyan [MISC]  (0) 2015.08.12
Easy Crack Me[Would you Crack Me?]  (0) 2015.05.30
[C++] Template  (0) 2015.01.02
블로그 이미지

KuroNeko_

KuroNeko

,