-
[F.T.Z] Level 18Wargame/F.T.Z 2022. 10. 5. 03:27반응형
Level 18을 풀어보자.
이번 문제를 받아들이기까지 굉장히 오래 걸렸다. (5일..??)
그리고 아주 허무하게 풀렸다..
문제를 푸는 시간이 오래 걸린 것이 아니라 위에서 언급했듯 '받아들이기'까지 시간이 오래 걸렸다.
Level 18의 hint를 살펴보자.
우선 한 눈에 봐도 굉장히 길다.
스크린샷을 찍었지만, 사실 밑에 shellout() 함수가 선언된 부분은 나오지 않았다.
이 길고 긴 소스 코드때문에 지레 겁을 먹고 시간이 오래 걸렸다.
(정확히는 하나하나 분석해보겠다고 덤볐다가, 이해도 못하고 시간만 날려버렸다..)
소스 코드가 굉장히 길지만, 공격을 위한 부분만을 살펴보면 오히려 앞의 Level들보다 짧을 수도 있다.
main 함수 내의 첫 4줄의 변수 선언 부분을 잘 보도록 하자.
그리고 필요한 부분은 while 안의 check == 0xdeadbeef가 조건인 if 문이다.
check가 0xdeadbeef이면 shellout 함수가 실행되면서 Level 19의 권한으로 쉘이 실행됨을 알 수 있다.
마지막으로, switch문을 보면 공격에 필요한 코드 분석은 끝이다.

<Level 18의 hint> 소스 코드를 보는 것만으로도 이번 문제는 해결이 가능하다.
그래도 gdb를 이용해 어떻게 동작하는지 간략하게 알아보자.
우선, 이 문제의 핵심이라고 할 수 있는 <main+0> 부터 <main+3>까지를 보자.
이것이 의미하는 것은 100 바이트의 크기를 가진 string 배열이 ebp에서 100만큼의 거리에 있다는 것이다.
왜 이 부분이 중요하냐면, 그 동안의 문제들은 배열이 나중에 선언되어 있다.
그리고, 그 배열을 넘치게 하면서 원하는 페이로드를 입력해 공격을 진행했었다.
그런데 이번 문제는 소스 코드를 보면 알겠지만, 배열이 먼저 선언되어 있다.
이번에는 배열을 채우거나 하지 않고, check 값에 0xdeadbeef를 넣어줌으로서 문제를 해결할 수 있다.
<main+91>을 보면 이 부분이 check값을 비교하는 if 문이라는 것을 알 수 있다.
check는 현재 ebp에서 104 바이트만큼 떨어져있다.
아래에 더 많은 부분들이 있지만, 필요한 것들은 다 분석했기에 switch문 쪽을 찾아보도록 하자.

<attackme의 gdb 분석> 쭉 내려오다보면, printf를 call하는 부분들이 나타난다.
이 부분이 switch문이라는 것을 알 수 있다.
여기서부터는 이해가 조금 필요하다.
앞의 Level들에서는 배열을 먼저 채우고 check값 혹은 ret를 건들였다.
잘 생각해보면 언제나 배열이 ebp에서 더 멀리 있었다는 것을 알 수 있을 것이다.
입력값들이 배열을 채우고, 그것을 초과해 스택의 상부(배열의 위)로 간다고 생각하면 이해할 수 있다.
그런데, 이번에는 배열보다 check가 더 멀리 있다.
그렇다면 공격을 위한 페이로드를 입력해봤자 check는 건드리지도 못한다.
이것을 해결하기 위해 <main+481>을 보자.
dec 명령어와 함께 [ebp-112]의 주소를 가리키고 있다.
dec는 피연산자에서 1을 빼는 명령어로 [ebp-112]에 count가 위치하는 것을 알 수 있다.

<switch문 gdb 분석> 이제 할 건 다 했으니, 앞의 내용들을 세 줄로 정리해보자.
이번 문제는 string 배열이 check보다 먼저 선언되어 check를 건드릴 수 없다.
그런데 switch문의 default를 보면, count가 string 배열에 들어가 x를 채우는 것을 알 수 있다.
그렇다면 case 0x08일 때를 이용해 count를 감소시키고, 이를 통해 check로 접근할 수 있지 않을까?
위의 많은 내용들을 간단하게 정리한 것이고, 이것의 답은 '접근할 수 있다'이다.
count는 string을 채우고 count++을 수행하는데, 반대로 count--로 string보다 멀리 위치한 check에 접근을 한다.
check와 string은 4바이트만큼 차이가 나니 0x08을 4번 입력하고, 0xdeadbeef를 입력하면 된다.
아래의 사진은 페이로드를 입력한 것이고, 그 결과로 쉘이 실행되어 비밀번호가 나타나는 것을 보여준다.

<나타난 비밀번호> 반응형'Wargame > F.T.Z' 카테고리의 다른 글
[F.T.Z] Level 20 (1) 2022.10.09 [F.T.Z] Level 19 (0) 2022.10.05 [F.T.Z] Level 17 (0) 2022.10.01 [F.T.Z] Level 16 (1) 2022.09.30 [F.T.Z] Level 15 (0) 2022.09.29