똑같은 코드인데 로컬에서는 쉘 실행이 잘되는데 원격으로는 안되네요 ㅠㅠ
서버 libc 버전도 확인해보니 libc-2.31.so 였는데요.
read 함수 offset는 130 으로 끝나고 system 함수 offset은 410으로 끝나는 버전이었습니다.
디버깅해보니까 로컬에서 성공할때는 read는 130 system 410이 맞는데
원격에서는 read 140 system 420으로 끝나네요. 근데 원인을 전혀 모르겠어요 같은 코드고 서버로 준 값도 똑같은데 도대체 왜...??
- 성공했을때
[+] read: 0x7f8a02e90130
[+] libc base: 0x7f8a02d7f000
[+] system: 0x7f8a02dd4410
2)실패했을때
[+] read: 0x7f59d9bae140
[+] libc base: 0x7f59d9a9d010
[+] system: 0x7f59d9af2420
그리고 강의 슬라이드에 전체 익스플로잇이라고 되어있는 내용 복붙해도 정답이 안되네요 문제는 똑같은데..
[+] read: 0x7f59d9bae140
[+] libc base: 0x7f59d9a9d010
[+] system: 0x7f59d9af2420
나온대로라면 read 함수 주소는 140으로 끝나는데요..?
버전이 같아보여도 오프셋이 살짝 다른 경우가 꽤 있습니다. 일단 read 함수 주소에서 0x10만큼을 더빼서 해보세요. libc base 주소는 항상 000으로 끝나기 때문에 출력 결과만 보았을때는 0x10 만큼 더 빼서 해보면 될 수도 있을 것 같습니다.
예제 익스플로잇 코드는 로컬의 libc를 참조하여 오프셋을 계산하기 때문에 그대로 복사하셔서 실행하셔도 제대로 안될겁니다.
.
"서버 libc 버전도 확인해보니 libc-2.31.so 였는데요."
이거 어떻게 확인하셨나요? 너무 궁금해요 ㅠ
docker를 사용해도 실제 내부에서 사용하는 라이브러리 버전이 달라지는 일이 왕왕 있습니다..
libc 버전 보다는 libc의 md5값을 확인하는게 더 정확합니다. md5sum [LIBC_FILE_NAME]
을 통해서 확인해 보시면 좋을 것 같습니다.