GOT 질문

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

#pwnable
작성자 정보
답변 2
avatar
Sechack
CTF First Place

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

2021.12.12. 23:18
2dedce
워게임 고인물

저는 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
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기