IMyoungho 2019. 2. 5. 18:22

혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다.


FTZ 16번 문제이다. 코드를보자!

코드를 보면 변수 선언 뒤 call이라는 포인터에 printit함수의 주소가 저장된다.

그리고나서 fgets으로 버퍼에 값을 받고 call()함수가 호출되면

printit()이 실행되는 구조이다.





main()함수에서 쓰이지 않은 함수가 있는데

바로 shell()함수이다.

이 함수의 내용을 보니 한단계 위의 권한으로 "/bin/sh"을 실행시킨다.

이 함수를 이용하여 다음 단계로 갈 수 있다는 것을 알았다.

어셈블리어 코드를 보면 어떠한 주소값을 ebp-16에 넣고 있었고

저기까지 프로그램을 실행시킨 뒤, 저 값이 의미하는 것이 무엇인지 확인했다.

(printit()라고 짐작하고 있었다)





역시 저 값은 printit()를 의미했다.






다른방법 1.


다른방법2.

하지만 다른 방법으로도 printit()과 shell(()을 찾아보았다.






fgets으로 덮어쓸 수 있나 확인해보니 충분히 48개보다 적은 수 40으로

버퍼오버플로우가 가능한 것을 확인했다.





마지막으로 printit()대신 shell()함수의 주소값을 덮어씌우도록 진행하였고

call()에 printit()대신 shell()의 주소가 넘어가면서 결과는 성공했다!!


다음단계로~

반응형