언인텐으로 푼 듯한데.. 이유를 모르겠습니다.

풀이를 할 때,
payload = "%p "*15 payload += p32(getshell)
이런식으로 작성하고 실행하니 쉘을 획득할 수 있었습니다.

heap_buf의 크기는 0x80, stack_buf의 크기는 0x90이고
위의 페이로드에 작성한대로 실행하면
heap_buf에는 0xa0의 크기가 들어갑니다.
마찬가지로 stack_buf에도 0xa0의 크기가 들어가게되어 return 주소를 덮어 쓸 수 있는데 원인을 모르겠습니다...

#pwnable
작성자 정보
답변 1
avatar
fow
대표 업적 없음

안녕하세요!
heap_buf에는 포맷 스트링 변환 과정을 거치기 이전 문자열이 들어가고, stack_buf에는 sprintf()에서 heap_buf의 포맷 스트링을 변환한 결과가 복사되어 저장되기 때문에 overwrite가 일어나게 됩니다.
gdb를 이용해 sprintf() 실행 이후 heap_bufstack_buf에 각각 어떤 문자열이 저장되는지 확인해보시면 이해에 도움이 될 것 같습니다!

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