제공되는 바이너리 파일과 서버의 rop 바이너리의 libc버전

제공되는 바이너리 파일과 서버에 올라가있는 libc버전이 다른것 같습니다.
저는 libc 버전이 OS와는 독립적으로 컴파일을 하는 순간 결정 (PLT, GOT 값이 고정적이기 때문에) 되는 것이라고 생각하고있는데,
그것이 아니라 컴파일된 바이너리가 어느 OS(각기 다른 libc버전이 설치된 환경)에서 실행되냐에 따라 함수의 실제 주소가 결정되는 것인가요??

정리를 해보면,

  1. libc버전이 달라져도 바이너리 내의 PLT, GOT 주소는 항상 고정적이다.(애초에 libc 버전과 PLT GOT 주소는 관계없다.)
  2. 하지만 libc 버전에 따라 PLT GOT에 매핑되어있는 함수의 libc_base 로부터의 오프셋은 바뀐다.
  3. 컴파일 당시의 libc 버전은 실행되는 바이너리의 실제 함수 오프셋과 전혀 관계없다. (실행하는 환경의 libc에 따라 실행 중인 바이너리의 라이브러리 함수 오프셋이 결정된다.)
    정도로 이해하고 넘어가려고 하는데

혹시 이해를 잘못하고 있는 부분이 있다면 알려주시면 감사하겠습니다. :)

#pwnable
작성자 정보
답변 1
0dayrover
공부벌레

문제파일에는 libc.so.6 파일을 제공하고 있지 않은것 같습니다. 서버에서 돌아가고 있는 libc 버전을 다시 구해서 해보세요. 제 기억에 이 문제가 2.3X 버전이 아니고 2.2X 버전이었던것 같아요

2022.02.03. 22:23
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기