티스토리 뷰

포너블/FTZ

FTZ level18풀이

삼전동해커 2020. 8. 18. 16:15

level18을 풀어보장.

이번문제는 좀 어렵다. c언어 능력이 필요한듯...


hint를 먼저보자.


변수는 string[100],check,x,count가 있다.

스택에 쌓이는 모양은


높은주소->   count

     x

     check

낮은주소->   string


이런모양이다.

우리가 입력을하면 string에 들어간다. 근데 check변수는 string보다 위에 있기 때문에 여태 우리가 하던 방식으로는 익스플로잇을 할 수가 없다. 

일단 while문 안에 if조건으로 count가 100보다 크면 "what are you trying to do?"가 출력되고,

check가 0xdeadbeef이면 shellout함수를 호출하는데 이 함수가 쉘 권한을 상승시켜준다.


역시 check에 도달해야 한다.

해결법은 밑에 switch문에 있다.

switch문은 입력문에 \r과\n이 있으면 \a를 출력하고, 0x08이 있으면 count를 하나 줄이고 \b \b를 출력하고, 일반적인 경우에는 string[count]=x로 하고 count의 개수를 한개 늘린다. 즉 100개 이상 입력하면 what are you trying to do?가 출력된다.


즉 count는 string 배열의 인덱스인 셈이다. 그리고 0x08을 입력하면 인덱스인 count를 줄여준다.

그럼 string의 인덱스가 줄어들다보면(주소가 높아지다 보면), string[-4]에 도달하면 check에 도달할 수 있지 않을까?


그럼 string의 시작점이랑 check의 시작점의 거리를 찾아보자.


일단 string의 시작점을 찾으려하는데 gdb에서 찾기가 힘들었다. 왜냐하면, 일단 hint파일에서도 string을 거의 사용하지 않았다. 처음 선언할 때와 default위치에서만 보였다. 그래서 이것 가지고 찾아야한다. 



일단 선언부 근처에서는 없다.

대신 main+12에서 x의 위치를 찾았고, main+19에서 count의 위치를 찾았다.


그럼 default문 근처를 보자.



main+499에서 찾을수 있다. 왜냐하면 main+489에서 printf함수와 main+484의 값이 "\b \b"라는 점과 main+535에서 incl명령어로 count의 값을 increase하는 것이 있으니 그 사이에 string[count]=x;가 있을 거라 생각했다.


그래서 string의 위치는 ebp-100이고 check의 위치가 -4만큼 위에 있으니 ebp-104이겠다.


그럼 익스플로잇을



이렇게 해주면 된다.





'포너블 > FTZ' 카테고리의 다른 글

FTZ level19 풀이  (0) 2020.08.19
FTZ level17 풀이  (0) 2020.08.17
FTZ level16풀이  (0) 2020.08.17
FTZ level15풀이  (0) 2020.08.17
FTZ level14 풀이  (0) 2020.08.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함