문제 화면이다. uid를 설정하고 strcpy를 실행한다. strcpy buffer overflow 문제라 구글링하여 방법을 찾아 진행하였다.
gdb로 살펴보면 str의 크기를 확인할 수 있다. sub $0x108, %esp에 해당되며 str의 크기는 0x108, 264byte이다. 또한 바로 아래에서 sub $0x8, %esp를 한 번 더 해주는데 이는 주소 값을 저장하기 위한 공간이다. 따라서 str 배열 256byte와 dummy 값 8byte, sfp 4byte, ret 주소 4byte로 총 272byte로 이루어져 있다.
* 원래 파일에서 gdb를 실행하면 에러가 나서 tmp 폴더에 복사해서 gdb를 실행했다.
힌트를 보면 /usr/bin/bof의 소스 코드가 존재한다. buf와 buf2가 존재하고, buf를 40글자 입력받는다. 그리고 buf2가 "go"일 경우, uid를 3010으로 설정한 후 쉘을 실행한다. 이때 주의해야 할 것은 buf가 10글자라는 것이다. 이를 통해 overflow 공격이 가능하다.
/usr/bin/bof를 gdb로 분석한 내용이다. 여기서 주의해서 볼 내용은 다음과 같다.
이는 각각 buf와 buf2를 나타낸다. 이 둘 사이에는 16의 간격이 존재한다. 즉 buf에 16글자를 채우고 나면 그 다음부터는 buf2에 대입이 된다.
/usr/bin/bof를 실행한 후 앞에 임의의 16글자를 채우고 "go"를 17, 18번째 글자로 입력하게 되면 buf2가"go"가 된다. 그러면 level10 권한으로 쉘이 실행된다. 그 상태에서 my-pass 명령어를 사용하면 level10의 password가 출력된다.