level16

해커스쿨 FTZ 2018. 4. 2. 17:32

이번문제의 힌트 또한 한 프로그램이다.


먼저 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 로 짜고 실행해서 쉘을 획득했다.




'해커스쿨 FTZ' 카테고리의 다른 글

level18  (0) 2018.04.02
level17  (0) 2018.04.02
LEVEL15  (0) 2018.03.29
level14  (0) 2018.03.28
level13  (0) 2018.03.28
블로그 이미지

천재보다는 범재

,