call이란 함수포인터에 printit 함수의 주소를 담은 후에 마지막에 call 함수 포인터를 호출해서 printit을 실행하네요! 근데 printit함수에는 필요없는것이 존재하고
shell함수에는 level17의 권한이 주어져있네요!
그렇다면 printit의 주소 대신에 shell의 주소를 넣어줘야겟네요!
또한 fgets로 buf에 값을 넣을 수 있는데 48만큼 넣을 수 있으므로 
crap함수와 call을 덮어 쓸 수 잇겠네요


gdb로 열어봤습니다!

main +3 에서 0x38(56)만큼 확장 되었네요!
또한 main+6 지점에서 *call에 printit 의 주소값인 0x8048500을 넣어버립니다!

그리고 main 36,39 지점을 보시면ebp-16 지점을 읽어와 eax에 저장하고 call을 하는걸 보아하니 ebp-16 지점을 shell함수의 주소로 바꿔주면 되겠네요 


info functions를 쓰면 함수들의 정보가 출력이되서 shell의 주소값을 가져왔습니다.
ebp-16지점이니 buf랑 call함수랑 40이 차이가 나는군요 

그렇다면 여태까지 주어진 정보로 공격코드를 생각해보면
buf(40)만큼의 크기를 쓸데없는것으로 채워주고 shell의 주소를 쓴 후에 파이프를 사용하면 되겠습니다


level17의 권한이 주어진것을 확인할 수 있습니다.

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

FTZ-LEVEL18  (0) 2016.04.24
FTZ-LEVEL17  (0) 2016.04.24
FTZ-LEVEL15 [gdb로 푸는법]  (0) 2016.04.24
FTZ - LEVEL14  (0) 2016.04.24
FTZ - LEVEL13  (0) 2016.04.23

+ Recent posts