level12

해커스쿨 FTZ 2018. 3. 28. 13:54

이번에도 hint파일을 tmp폴더에 복사해서 컴파일 했다.


이번에는 gets함수가 있다. 컴파일할떄 gets를 쓰지 말라고 할 정도로 위험한 함수라고 한다.


우선 gdb로 main을 보았다.


보면 main+66에 gets함수가 있는 것을 볼 수 있다.

그 바로밑인 main+71에 BP를 걸고 run해 보았다.


264byte이상을 입력해서 segmentation fault가 뜬 것 같다.


이 상태에서 esp를 확인해 보았다.


0xbfffdf60부터 0x41이 반복되는 것을 볼 수 있다.


0x41은 아스키코드상 A를 의미하므로 내가 입력한 값인 것을 알 수 있다.



이를 이용하여 0xbfffdf60부터 243바이트를 0x90으로 채우고 나머지 25바이트를 쉘코드를 채운 후 ret을 0xbfffdf60로 오버플로우 하였다.


그러자 이상한 문장이 뜨며 No such file or directory가 뜬다.


혹시나 gdb를 다시돌려보니 0x41이 시작하는 주소값이 계속 변하는걸 볼 수 있었다. 어떻게 해결할지 고민하던중 환경 변수에 대해 알게 되었다.




이렇게 SHELLCODE라는 환경변수를 만들었다. 구조는 \x90 243개 후 쉘코드를 넣었다.


그리고 이 환경변수의 주소를 알아야 하기 때문에

이렇게 주소를 출력하는 프로그램을 코딩, 컴파일 하였다.


이렇게 주소가 0xbfffb37이라는 것을 알았으니 이제 BOF를 다시 해보았다.


'A' 268개로 sfp까지 모두 덮은 후 ret에다가 환경변수의 주소를 넣었다.


그랬더니 왼쪽에 쉘표시가 뜨지는 않지만 권한을 얻었고, 비밀번호도 알 수 있었다.


ps. 첫번째 방법으로 어떻게 하는지 아직도 잘 모르겠다. level11의 경우는 그냥 r하고나서 x/1000x $esp하면 esp를 보여줬는데 이번문제는 r하고 나서 문자열 입력하고 나면 프로그램이 아얘 종료되는지 esp가 나오지 않았다.

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

level14  (0) 2018.03.28
level13  (0) 2018.03.28
level11  (0) 2018.03.27
level10  (0) 2018.03.26
level9  (2) 2018.03.26
블로그 이미지

천재보다는 범재

,