역시 bof 로 보이고, fgets 함수의 취약점을 이용하면 될 것 같다.
20 바이트 크기의 buf 를 할당하고, 사용자로부터 48바이트 만큼의 입력을 받는다.
그리고 printit 의 주소를 출력해주는 실행파일로 보인다.
우리는 위에 보이다시피 shell() 의 주소가 call() 되도록 만들면 쉘을 딸 수 있을 것이다.
하도 많이해서 익숙해진 gdb 로 buf 와 call() 의 거리를 확인해보자.
스택까지 그려보자.
손으로 써서 알아보기 어렵지만,
대충 esp-56(0x38) 이 buf 의 시작주소, esp-16 이 call() 의 시작주소가 된다는 뜻.
즉, esp-16 에 들어간 주소 값이 printit() 의 주소가 된다는 뜻이다.
이자리에 shell() 의 시작주소를 넣고 싶은거니까, shell() 을 disas 해서 시작 주소를 알아내자.
0x080484d0 이 shell() 의 시작 주소이다.
그럼 buf 와 call() 의 주소가 40만큼의 차이가 나므로
페이로드를 작성해서 입력해주면,
level17 password "king poetic" 획득 !
계속 비슷한 형태의 스택 구조가 나와서 문제 풀이는 간단한 것 같다.
'WARGAME > FTZ [system]' 카테고리의 다른 글
ftz level 18 [level18] (0) | 2020.05.01 |
---|---|
ftz level 17 [level17] (0) | 2020.05.01 |
ftz level 15 [level15] (0) | 2020.05.01 |
ftz level 14 [level14] (0) | 2020.04.30 |
ftz level 13 [level13] (0) | 2020.04.30 |