이번문제의 힌트 또한 한 프로그램이다.
먼저 shell() 이라는 함수를 선언하는데 이 함수는 setreuid를 통해 level17의 권한으로 /bin/sh를 실행시켜주는 함수다.
딱 봐도 이 함수를 실행시키면 문제가 풀리도록 되어있따.
두번째 함수는 printit()이다. 이 함수는 "Hello there!"을 출력하고 종료하도록 되어있다.
main의 경우는 void (*call)()=printit; 이 뭘 의미하는지 확실히는 모르지만 맥락상 *call이 printit함수의 주소를 가리키도록 되어있는것 같다.
그 밑에 buf[20]이 선언되어 있고, fgets가 버퍼 이상을 입력받으므로 *call을 오버플로우 할 수 있을거라 예상했다.
이 경우에도 공간은 총 0x38, 즉 56이 할당되었고, main+16에서 ebp-16으로 값을 넣는걸 보니 40byte만큼 입력 후 shell() 함수의 주소를 넣으면 될 것 같았다.
gdb에서 shell의 주소를 보았더니
주소가 0x080483ec인것을 확인할 수 있었다.
따라서 코드를 (python -c 'print "A"*40 + "\xd0\x84\x04\x08"';cat)|./attackme 로 짜고 실행해서 쉘을 획득했다.