완료됨
GOT 질문

[두 번째 호출이라면 GOT에 실제 함수의 주소가 쓰여있지만, 첫 번째 호출이라면 GOT에 실제 함수의 주소가 쓰여있지 않다.] 라고 알고있는데 첫 번째 호출에서도 함수의 GOT를 저장할 주소는 이미 존재하는 건가요?

#pwnable
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 2

Full relro일 경우에는 처음부터 got에 실제 함수 주소가 들어가있고 Partial RELRO일 경우에는 Lazy binding이라는 과정을 거쳐서 첫번째 호출때 실제 함수의 주소를 구해옵니다. Lazy binding에 대해서 공부해보시면 궁금증을 해결하실 수 있을거에요.

2021.12.12. 23:18

저는 plt got가 잘 이해가 안됐는데 다음 문장을 기억하니까 쉽더라고요.
PLT는 명령어가 있는 곳이고(여기도 명령어가 규칙적으로 배열되어 있으니 테이블이라고 합니다), GOT는 주소가 적혀있는 테이블입니다.
라이브러리함수 puts를 예를 들어보죠. 라이브러리 함수를 호출하면 puts@plt로 점프합니다. puts@plt에서는 puts@got에 적혀있는 곳으로 점프합니다.
첫 번째 호출에서 puts@got에는 라이브러리의 puts의 주소가 아니라 puts@plt+6가 적혀있고, 거기로 점프하면 이어서 _dl_runtime_resolve로 점프합니다. 이 함수의 역할을 라이브러리의 puts의 주소를 구하여 puts@got에 적어주고 puts를 호출한다고 합니다.

두 번째 호출할 때도 puts@plt로 점프하고, puts@plt에서는 puts@got에 적혀있는 곳으로 점프하는데 이때는 puts@got에 라이브러리의 puts주소가 적혀있어서 바로 puts를 호출하게 됩니다.

잘 이해가 안가시면 https://rond-o.tistory.com/216 를 한번 읽어보시고 구글링해서 다른 글들을 더 찾아보세요.

2021.12.13. 02:45