libc stdout 질문

안녕하세요. 이번 문제를 풀면서, stdout의 주소를 통해 libc_base를 leak하여 풀었는데,

libc의 stdout의 offset은 libc_base = libc_stdout - libc.symbols['stdout']
가 아닌, libc_base = libc_stdout - libc.symbols['_IO_2_1_stdout_']인 것을 어떻게 알아낼 수 있나요..?

readelf -s ./libc.so.6 | grep stdout으로도 stdout 밖에 안나와서 stdout으로 했는데,
왜 이 offset으로 하면 안되는지와, 문제를 풀 때 _IO_2_1_stdout_ 을 symbol으로 어떻게 찾을 수 있는지 궁금합니다.

감사합니다.

#pwnable
작성자 정보
답변 1

안녕하세요, leak하신 부분은 실행 파일 내부에 존재하는 전역 변수 stdout에 들어 있는 값을 leak 하신 겁니다. 전역 변수 stdout은 libc에 있는 stdout 심볼을 가리키는 것이 아니라 _IO_2_1_stdout_를 가리키는 포인터이므로, 해당 변수에 있는 값을 leak하셨으면 leak한 값은 libc의 _IO_2_1_stdout을 의미하게 됩니다.

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