CTF

pwn/ madlibs

lok2h4rd 2021. 7. 19. 19:31

문제

제작가가 미친 도서관 게임(...)을 만들었다고 합니다. 초급자인 저에게는 가혹할 것 같은 문구네요

 

차례대로 코드를 보면 game함수에서 두개의 문자열을 입력받고 

이것들을 합치고 어러꿍저러꿍한 값을 sprintf를 통해 80크기의 배열인 buf에 저장하고 buf를 출력하게 됩니다.

 

problem

해당 코드에서는 sprintf로 문자열을 buf에 저장을 하였는데 sprintf함수에서도 버퍼오버플로우가 발생할 수 있다는 것입니다.

 

그럼 buf에 저장하는 값이 0x80을 넘겨서 return address를 win함수로 덮어쓰게되도록하면 flag가 출력되겠죠

 

buf에 넘어가는 문자열을 %s를 변수명으로 치환해서 다시 나타내면

"noun is so adj at deepspacewifu! I wish I were adj like noun"

이 값을 buf에 저장하게 됩니다.

결국 2(noun + adj) + 문자열로 return address를 덮어씌워 주면 됩니다.

그리고 마지막으로 출력되는 값이 noun변수의 문자열이기 때문에 noun 끝부분에 win함수의 주소를 넣어주면 overwrite이 될 것입니다.

 

win 함수 주소
buf 주소

이제 return address에 들어갈 win함수의 주소를 얻고

buf함수를 통해 return address와의 거리(0x108)를 확인하고

 

payload

해당 거리만큼 즉 "noun + win주소 is so adj at deepspacewifu! I wish I were adj like noun + win주소"가 되도록 코드를 짜고 실행시키면

return address를 win함수로 덮어써서 win함수가 실행되도록 하여 flag를 얻었습니다

 

 

 

 

이론으로만 알았던 버퍼오버플로우를 직접 문제로 풀어볼수 있어서 재미있었던 것 같습니다..