완료됨
5 코인 풀이법 질문

일단 저는 memset의 got에 shellcode를 넣고 실행하여 익스플로잇에 성공하였는데,

  1. ROP로 memset got의 주소에 shellcode를 넣었다면 최종 리턴 어드레스 (페이로드의 마지막 부분)이 p64(memsetgot)가 아니라 p64(memsetplt)가 되어도 익스플로잇이 되야하지 않나요? plt는 got의 주소를 참조하기에 memsetgot에 주소를 넣고 plt를 실행시키면 익스가 될줄 알았는데 got에 덮어 씌우고 최종 리턴주소도 memsetgot로 해야만 익스플로잇이 되더군요
  2. 다른 질문이나 댓글에서는 bss도 종종 언급하던데, bss에 무언가를 덮어씌우고 실행시킨다는 발상은 어떤부분에서 근거하나요? 그냥 힌트를 기반으로 bss영역에 무언가를 써도 실행권한이 있을테니 bss에 shellcode를 덮고 bss를 리턴주소로 쓴건가요?

다소 간단한 질문이지만 답해주시면 감사하겠습니다!

#pwnable
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
질문자가 채택한 답변입니다. 좋은 지식을 공유해줘서 고마워요!
avatar
wyv3rn
무플 방지 위원회장
  1. 이해하신 부분에 조금 오류가 있습니다. got은 plt의 주소를 담고 있는 공간입니다. got은 포인터와 비슷한 기능을 하며, plt는 실제로 해당 함수의 주소를 의미합니다. 따라서 plt 주소로 return하게 되면 해당 함수가 직접적으로 실행됩니다.
  2. 메모리에 적절한 권한이 있는가.를 기준으로 합니다. 각 메모리 영역마다 읽고, 쓰고, 실행할 수 있는 권한이 나눠져 있습니다. shell code를 넣고 실행한다고 가정하면 쓰기와 실행권한이 있는 어느 주소던 상관 없습니다. 보통 advanced gdb에서는 vmmap과 같은 명령어로 쉽게 확인 가능하고, 그게 아니라면 프로세스를 실행한 뒤 맵핑된 메모리를 읽어보시면 됩니다.
    통상적으로 bss 영역은 읽기와 쓰기 권한이 주어집니다.
    참고할만한 글이 있어 공유 드립니다. https://qkqhxla1.tistory.com/266
2025.04.25. 21:27