Level16로 접속해서 항상 그렇듯이 파일 목록과 hint를 확인해 보도록 하겠습니다.
가볍게 코드에 대해서 짚고 넘어가면,
Level17의 권한으로 쉘을 띄워주는 shell()함수가 선언 되어 있고, “Hello there!”라는 문장을 출력해주는 printit()함수가 있네요.
main에서는 *call이라는 포인터 변수에 printit의 주소값을 넣어 주었구요.
이로 인하여 call()하였을 때 printit함수가 호출되게 됩니다.
쉘을 띄우려면 shell() 함수를 호출해야하니 call 포인터 변수에 shell()의 주소값을 넣어 주면 될 것 같습니다.
우선 gdb로 어셈블리어를 확인해 보도록 하겠습니다.
shell함수와 printit함수는 다음과 같구요.
Main은 다음과 같습니다.
<main+6>을 보면 ebp-16에 0x8048500을 넣는 것을 확인 할 수 있는데요. 위에서 알 수 있듯이 0x8048500은 printit 함수의 시작지점입니다.
우리가 원하는 건 shell함수이니 ebp-16에 shell함수의 시작 주소 0x080484d0을 넣어주면 됩니다.
Fgets 함수는 ebp-56지점부터 입력을 하니 ebp-16에 원하는 값을 넣기 위해서는 40byte를 채우고 0x080484d0을 넣어주면 될 듯 하네요.
예상대로 값을 입력하도록 하겠습니다.
맞았네요. 정상적으로 level17의 쉘이 획득 되었습니다.
Level17의 패스워드는 king poetic입니다.
'HackerSchool Series > F.T.Z.' 카테고리의 다른 글
[F.T.Z.(Free Training Zone)] Level - 18 (0) | 2016.01.10 |
---|---|
[F.T.Z.(Free Training Zone)] Level - 17 (0) | 2016.01.06 |
[F.T.Z.(Free Training Zone)] Level - 15 (0) | 2016.01.06 |
[F.T.Z.(Free Training Zone)] Level - 14 (0) | 2016.01.03 |
[F.T.Z.(Free Training Zone)] Level - 13 (0) | 2016.01.03 |