stdout 오프셋 찾을 때, objdump랑 gdb에서 찾는거랑 값이 다르고 익스플로잇 성공여부도 다른데 왜 인가요?

dreamhack강의를 보면 gdb를 통해서 stdout 오프셋 값을 구해서 사용하는 것처럼 oneshot문제에서도 stdout 오프셋을 직접 gdb를 통해 찾아서 익스플로잇을 해봤지만 성공하지 못했습니다. 강의를 보면 라이브러리의 오프셋은 환경이나 라이브러리 마다 다르다고 나와있는데요. 그럼 제 환경에 맞는 오프셋도 실행이 되어야 하는게 아닌가 하는 의문점이 듭니다.

또, 다른 질문자님에 답변을 보며 objdump -D libc.so.6 ~ 을 이용해서 오프셋을 구해서 익스플로잇을 하면 성공하는 것도 확인했는데 다른 점이 뭔지, gdb에서 구한 값은 왜 익스플로잇에 실패하는지 궁금합니다.

#pwnable
작성자 정보
답변 1
Karatus
워게임: 50

ldd <실행파일>을 해서 나오는 라이브러리가 미리 설정을 하지 않았을 시 프로그램이 메모리에 올라가면서 사용될 라이브러리입니다.
참고로 여기서 말씀드리는 '미리 설정'이란 환경 변수의 값 중 LD_PRELOAD라는 게 있는데 여기에 설정된 값이 있다면 메모리에 올라갈 때 해당 변수에 있는 값의 라이브러리를 먼저 로드합니다.

그렇기 때문에 위에서 말씀하신 objdump -D libc.so.6 ~ 이 명령어는 현재 디렉토리에 libc.so.6 이라는 파일을 이용하여 offset을 찾는 것이고, gdb에서는 자동으로 버전 맞게 로드하는 라이브러리라서 같은 빌드 버전이 아니라면 offset이 다를 수 있는 겁니다.

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