티스토리 뷰




FTZ level17

pw : king poetic


레벨 17입니다.


먼저 hint를 보겠습니다.



buf의 크기가 20바이트인데 입력은 48바이트 만큼 받군요. bof취약점이 존재합니다.


전 레벨과 차이점이 있다면


똑같이 printit이라는 함수를 호출해주지만,


아까는 메모리주소를 shell이라는 함수로 바꿔주었죠


하지만 이번에는 쉘을 실행시켜주는 함수가 존재하고있지 않습니다.


따라서 쉘코드를 이용해야 할 것 같습니다.


setreuid가 걸려있으니 쉘코드로 쉘을 실행시키고 나면 권한을 얻을 수 있을 것 같습니다.




call하는 부분을 찾아서 그 주소를 원하는 주소로 바꾸도록 하겠습니다.


먼저 call하는 부분을 찾기 위해서 분석을 해보겠습니다.


분석을 하기 위해서 tmp폴더로 복사하겠습니다.



보기편한 intel 형식으로 지정했습니다.


어셈블리 코드입니다.



먼저 0x38만큼 스택 프레임이 형성되어있습니다.


0x38은 10진수로


56 입니다.



그리고 fgets함수로 ebp-56부터 입력을 받습니다.


따라서 esp부터 입력을 받습니다.



ebp-16에 있는 값을 call합니다.


여기가 printit함수를 call하는 부분인 것 같습니다.


이 부분을 특정 쉘코드가 있는 곳으로 bof를 이용해서 점프하면 될 것 같습니다.


따라서 ESP가 56이므로

40만큼 a로 값을 채워주고

그 다음 call할 주소를 써주면 될 것 같습니다.


이제 쉘코드를 메모리 상에 저장해야 하는데요.


아마 스택프레임안에 저장 할 수 있을 것 같긴하지만,


편하게 환경변수를 이용하겠습니다.


export SH=$(python -c 'print "\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"')


SH이라는 환경변수를 만들었습니다.


여유롭게 \x90을 100개 정도 넣어줬습니다.


이제 환경변수의 주소를 구해보겠습니다.



getenv함수를 이용해서 주소를 구할 수 있습니다.



컴파일을 해줍니다.



주소가 나옵니다.


주소는 0xbffffe6d입니다.


이제 페이로드를 짜보겠습니다.



A를 40개 넣어주고 call할 주소를 리틀엔디안 형식으로 써줬습니다.


fgets함수를 이용하기 때문에 |파이프 명령으로 값을 넘겨줘야 합니다.



쉘을 획득했습니다.


이제 실제 파일에 공격해보겠습니다.



권한이 상승되었습니다.



Level18 Password is "why did you do it".










'pwnable > FTZ' 카테고리의 다른 글

[Hackerschool FTZ] Level19 write-up  (0) 2018.01.18
[Hackerschool FTZ] Level18 write-up  (0) 2018.01.18
[Hackerschool FTZ] Level16 write-up  (0) 2018.01.15
[Hackerschool FTZ] Level15 write-up  (0) 2018.01.15
[Hackerschool FTZ] Level14 write-up  (0) 2018.01.15
Comments