완료됨
GOT 질문
[두 번째 호출이라면 GOT에 실제 함수의 주소가 쓰여있지만, 첫 번째 호출이라면 GOT에 실제 함수의 주소가 쓰여있지 않다.] 라고 알고있는데 첫 번째 호출에서도 함수의 GOT를 저장할 주소는 이미 존재하는 건가요?
#pwnable
작성자 정보
답변
2
저는 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 를 한번 읽어보시고 구글링해서 다른 글들을 더 찾아보세요.