Wargame/F.T.Z
-
[F.T.Z] Level 20Wargame/F.T.Z 2022. 10. 9. 07:41
Level 20을 풀어보자. 마지막 문제이니 시간을 들여 천천히 풀기 위해 주말까지 기다렸는데, 예상보다 더 어렵다.. 물론 개념을 미리 알고 있었으면 쉬웠을테지만, 그렇지 못하니 어려운 건 몸으로 부딪혀가며 알아가고 있다. Level 20의 hint를 살펴보자. 소스 코드가 짧은 것을 보니, 어려운 문제다. (짧은게 더 어려운 것 같다.) 코드를 분석해보자. 먼저, char 형의 80 바이트 크기를 가지는 bleh 배열이 선언된다. 다음으로 setreuid를 선언해 권한을 변경한다. 그 다음 fgets 함수를 통해 bleh에 입력된 79바이트를 표준 입력으로 가져온다. 마지막으로 bleh를 출력하며 프로그램이 끝난다. 굉장히 간단한 코드인데, 뭔가 이상하다. fgets에서 가져오는 크기가 선언된 배열 ..
-
[F.T.Z] Level 19Wargame/F.T.Z 2022. 10. 5. 05:08
Level 19를 풀어보자. Level 19의 hint를 살펴보자. F.T.Z의 초반 Level에서나 보던 아주 짧은 hint다. 3줄이기는 하지만 buf 배열도 있고, overflow를 할 수 있는 gets 함수도 있다. 있을건 대충 있는 것 같으니 다음 단계로 가보자. gdb로 attackme 파일의 main을 분석해보자. buf 배열이 ebp에서 40 바이트만큼 떨어져 있는 것이 보인다. sfp의 4 바이트를 더하면 ret까지는 44 바이트만큼 떨어져 있다는 것을 알 수 있다. NOP를 44 바이트만큼 채우고 ret를 변조하면 공격이 될 것이다. 이번 문제는 main 함수에 setreuid가 없으므로, setreuid가 포함된 쉘코드로 환경 변수를 만들도록 하자. 쉘코드의 앞에 NOP를 25 바이트..
-
[F.T.Z] Level 18Wargame/F.T.Z 2022. 10. 5. 03:27
Level 18을 풀어보자. 이번 문제를 받아들이기까지 굉장히 오래 걸렸다. (5일..??) 그리고 아주 허무하게 풀렸다.. 문제를 푸는 시간이 오래 걸린 것이 아니라 위에서 언급했듯 '받아들이기'까지 시간이 오래 걸렸다. Level 18의 hint를 살펴보자. 우선 한 눈에 봐도 굉장히 길다. 스크린샷을 찍었지만, 사실 밑에 shellout() 함수가 선언된 부분은 나오지 않았다. 이 길고 긴 소스 코드때문에 지레 겁을 먹고 시간이 오래 걸렸다. (정확히는 하나하나 분석해보겠다고 덤볐다가, 이해도 못하고 시간만 날려버렸다..) 소스 코드가 굉장히 길지만, 공격을 위한 부분만을 살펴보면 오히려 앞의 Level들보다 짧을 수도 있다. main 함수 내의 첫 4줄의 변수 선언 부분을 잘 보도록 하자. 그리고..
-
[F.T.Z] Level 17Wargame/F.T.Z 2022. 10. 1. 00:27
Level 17을 풀어보자. Level 17도 그리 어렵지는 않고, Level 16을 풀 때와 비슷하게 풀이를 진행하면 된다. hint를 살펴보면, Level 16처럼 call의 포인터에 printit 함수의 주소를 넣는다. Level 16과 다른 점이라면 이번에는 Shell 함수가 없다. 풀이를 위해서는 main 함수의 제일 아래 call 함수가 호출될 때 직접 쉘을 실행하도록 해야 한다. gdb를 이용해 분석을 해보자. printit 함수의 주소는 0x8048490인 듯하다. (이번에는 printit 함수는 분석하지 않고 넘어가자.) 이번에도 buf와 call 사이에 40 바이트의 크기가 있다. 이것을 NOP 으로 채우고, 앞의 Level들에서 했었던 환경변수를 선언해 그 주소값을 call에 넣어주도..
-
[F.T.Z] Level 16Wargame/F.T.Z 2022. 9. 30. 11:42
Level 16을 풀어보자. Level이 올랐지만, 생각보다 Level 16은 쉽게 풀렸다. hint를 보고, 소스 코드를 분석해보자. 먼저 shell, printit 이라는 두 개의 함수가 선언되어 있다. 함수의 내용은 간단하니 넘어가도록 하자. main 함수 안을 보면, call 포인터에 printit 함수를 저장한다. 그리고 buf 배열을 선언한 후, fgets 명령어를 통해 buf에 값을 넣는다. 끝으로 call 함수를 불러내는 것으로 소스 코드가 끝나는데, printit 함수가 실행될 것으로 보인다. gdb를 통해 더 분석을 해보자. main 함수에 대해서 먼저 보도록 하자. 을 보면 0x8048500이라는 주소값을 ebp-16 주소에 넣는다. 그리고 을 보면 그 주소값을 eax에 넣고 에서 저..
-
[F.T.Z] Level 15Wargame/F.T.Z 2022. 9. 29. 23:38
Level 15를 풀어보자. Level 15는 Level 14와 유사하기 때문에 쉽게 풀 수 있다. Level 15까지 오면서 하지 않은 딱 한 가지만 해주면 된다. Level 15의 hint를 살펴보자. Level 14의 소스 코드와 같다. 아니, Level 14와는 다르게 if 문의 check가 포인터로 되어 있다. 이번 문제를 해결하기 위해서는 0xdeadbeef의 주소값을 알아내 check의 포인터에 넣어야 한다. 먼저 gdb를 실행해보자. 를 보면 eax의 주소값과 0xdeadbeef를 비교해 같은지 확인한다. 0xdeadbeef의 주소를 알아보기 위해 cmp가 실행되는 0x080484b0 주소에 break를 걸어서 동작을 확인하자. 그런데, 홈디렉터리에서는 break가 되지 않는다.. /tmp..
-
[F.T.Z] Level 14Wargame/F.T.Z 2022. 9. 28. 00:12
Level 14를 풀어보자. 이번에는 새로운 개념을 알 필요는 없고, 앞의 Level 들에서 했던 풀이를 잘 적용하면 된다. 먼저, hint를 살펴보자. Level 14부터는 mainsource에서 문제를 그대로 가져왔다는 안내 문구가 있다. 뭔가 새로운 문제가 나오는 것 같아 떨리지만, 이번 Level은 다행히 쉬운 편이다. crap 과 check 라는 int 형의 변수가 선언된다. 그리고 20 바이트 크기의 char 형의 buf 변수가 선언된다. fgets로 45 바이트 크기만큼 buf에 표준 입력을 한다. (overflow) 그리고 선언했던 check가 0xdeadbeef 이면, Level 15의 권한을 얻은 상태로 쉘을 실행한다. 힌트 해석은 여기까지인데, check만 변형하면 쉘이 실행되므로 쉘..
-
[F.T.Z] Level 13Wargame/F.T.Z 2022. 9. 26. 17:42
Level 13을 풀어보자. Level 13은 앞의 문제들과 비슷한데, 한 가지 방어 개념이 추가되었다. 책에서 설명으로만 보던 것이라 신기한 느낌이다. (유니콘..??) 우선 Level 13의 hint를 살펴보자. 이번에도 strcpy를 사용하고 있으니 공격이 가능할 것 같다. 그런데 long 타입의 i라는 변수가 선언되어있다. (이것이 방어를 위한 장치이다.) 다른 명령어들은 앞의 Level 들에서 충분히 해석을 한 것 같고, 마지막의 kill에 대해서만 알아보자. 구글링을 해보니 Kill 시그널을 보내는 명령어이다. 간단하게 허가되지 않은 메모리 영역으로의 접근을 종료한다고 생각하자. gdb를 이용해 attackme 파일을 분석을 해보자. 를 보면 ebp와 buf 사이에는 1048 바이트의 크기만큼..