puts@plt + 0에 puts@plt + 6의 주소가 들어있어서 호출되면 puts@plt+6의 코드가실행
puts@plt + 11 에서 점프하면 pushl, jmp로 분기된다.
pushl로 GOT+4의 주소를 스택에 넣고 GOT+8의 주소로 분기하는데 여기에는_dl_runtime_resolve의 주소가 있다.
_dl_runtime_resolve 에서 _dl_fixup 을 호출한다.
_dl_fixup 함수에서는 edi에 puts의 offset을 넣고 esi에 .strtab의 주소를 넣는다
(.strtab + offset = 'puts' 문자열이 들어가있다.)
eax에는 'puts'문자열의 주소를 넣고 _dl_lookup_symbol_x 함수를 호출한다.
_dl_lookup_symbol_x 함수에서는 SYMTAB의 주소와 lib의 주소를 얻고 _dl_fixup 함수로 나와서 SYMTAB에서 아까전에 넣어논 esi(.strtab), edi(offset)응 이용해 실제 주소를 구하고 GOT에 write하고 _dl_runtime_resolve 함수로 다시와서 puts함수로 넘어가게 된다.
이런식으로 한번 dynamic linker가 주소를 받아오는 과정을 거치게 되면 다음번에는_dl_runtime_resolve함수로 들어가지 않고 바로 puts@plt에서 바로 실제 puts함수의 코드로 들어가게 된다.
--------------------------------------------------------------------------------------------
1. puts@plt
2. puts@plt+6
3. puts@plt+11
4. _dl_runtime_resolve(GOT+8)
Read more
puts@plt + 11 에서 점프하면 pushl, jmp로 분기된다.
pushl로 GOT+4의 주소를 스택에 넣고 GOT+8의 주소로 분기하는데 여기에는_dl_runtime_resolve의 주소가 있다.
_dl_runtime_resolve 에서 _dl_fixup 을 호출한다.
_dl_fixup 함수에서는 edi에 puts의 offset을 넣고 esi에 .strtab의 주소를 넣는다
(.strtab + offset = 'puts' 문자열이 들어가있다.)
eax에는 'puts'문자열의 주소를 넣고 _dl_lookup_symbol_x 함수를 호출한다.
_dl_lookup_symbol_x 함수에서는 SYMTAB의 주소와 lib의 주소를 얻고 _dl_fixup 함수로 나와서 SYMTAB에서 아까전에 넣어논 esi(.strtab), edi(offset)응 이용해 실제 주소를 구하고 GOT에 write하고 _dl_runtime_resolve 함수로 다시와서 puts함수로 넘어가게 된다.
이런식으로 한번 dynamic linker가 주소를 받아오는 과정을 거치게 되면 다음번에는_dl_runtime_resolve함수로 들어가지 않고 바로 puts@plt에서 바로 실제 puts함수의 코드로 들어가게 된다.
--------------------------------------------------------------------------------------------
1. puts@plt
2. puts@plt+6
3. puts@plt+11
4. _dl_runtime_resolve(GOT+8)
실행 전에는 GOT+8이 0임, 메모리에 올라가면 GOT+8에 _dl_runtime_resolve의 주소가 들어감
5. _dl_fixup
5. _dl_fixup
edi : puts의 offset
esi : &.strlab
eax : &"puts"
esi : &.strlab
eax : &"puts"
<이놈들을 조작할 수 있으면 원하는 함수를 실행 할 수 있다.>
6. _dl_lookup_symbol_x
SYMTAB주소 얻음
lib의 주소 얻음
7. _dl_fixup
edi : puts의 offset
esi : &.strlab
이 두개를 이용해 SYMTAB에서 실제 주소 구해서 GOT에 write
8. _dl_runtime_resolve
puts의 공유라이브러리(실제 puts함수)로 넘어감
--------------------------------------------------------------------------------------------
6. _dl_lookup_symbol_x
SYMTAB주소 얻음
lib의 주소 얻음
7. _dl_fixup
edi : puts의 offset
esi : &.strlab
이 두개를 이용해 SYMTAB에서 실제 주소 구해서 GOT에 write
8. _dl_runtime_resolve
puts의 공유라이브러리(실제 puts함수)로 넘어감
--------------------------------------------------------------------------------------------