라이브러리 함수를 실행하게되면 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 |