버퍼 오버플로우
-
[FTZ]해커스쿨(HackerSchool) LEVEL18 풀이(Solution)미사용/##Security 2015. 8. 15. 01:21
HackerSchool FTZ WARGAME Solution Start : 15.07.03 LEVEL18 [그림 1] hint를 열어보면 [그림 1]과 같이 꽤 긴 코드가 출력된다. 코드에 나온 함수를 검색해보니 네트워크 소켓 프로그래밍에서 사용되는 다중 입출력에 사용되는 함수였다. 이를 풀기 위해선 다중 입출력에 대해 공부를 해야 했는데 시간이 너무 오래걸려 주요 함수 부분이 하는 역할정도만 파악을 하고 문제를 풀었다. 우선 count가 100 이상이 되면 어떤 동작을 하든 "what are you trying to do \n"이 출력이 되는데 이 코드는 버퍼 오버플로우를 방어하기 위한 방어 코드라는 것을 알 수 있다. 그리고 check 변수의 값이 0xdeadbeef 일 경우 shellout() 이라..
-
[FTZ]해커스쿨(HackerSchool) LEVEL17 풀이(Solution)미사용/##Security 2015. 8. 15. 01:21
HackerSchool FTZ WARGAME Solution Start : 15.07.03 LEVEL17 [그림 1] hint 파일을 열어보면 [그림 1]과 같이 출력이 되는데 앞에 level16과 흡사한 코드가 출력이 되는데 다른점은 방금과 다르게 shell 함수가 정의 되어 있지 않고, call 함수 포인터에 printit 포인터를 저장해서 호출하고 있다. shell 함수가 없더라도 직접 만들어서 주소값을 call 에 덮어쓰면 된다. [그림 2] 환경 변수에 쉘 코드를 저장한다. [그림 3] gdb로 attackme 를 열어서 call 변수의 위치와 buf 배열의 위치를 확인한다. 이번에도 두 변수의 겨리는 40byte 이기 때문에 버퍼 오버플로우 공격이 가능하다. [그림 4] [그림 5] 환경 변수..
-
[FTZ]해커스쿨(HackerSchool) LEVEL16 풀이(Solution)미사용/##Security 2015. 8. 15. 01:20
HackerSchool FTZ WARGAME Solution Start : 15.07.03 LEVEL16 [그림 1] hint 를 확인해 보면 [그림 1]과 같이 출력이 된다. 코드를 분석해보면 shell 함수와 printit 함수가 정의되어 있고, main 함수에서는 void 타입의 call 함수 포인터가 선언되어 있다. 그리고 해당 함수 포인터에는 printit 함수의 포인터가 저장되어 있으며 나중에는 call에 저장된 포인터로 함수를 호출한다. shell 함수에 상위 권한으로의 쉘을 실행시키는 코드가 포함되어 있으므로 우리는 이 shell 함수가 실행되도록 해야한다. [그림 2] gdb로 열어서 info functions 를 입력하면 정의된 함수 정보가 출력이 되는데 그 중 shell 함수의 주소값..
-
[FTZ]해커스쿨(HackerSchool) LEVEL15 풀이(Solution)미사용/##Security 2015. 8. 15. 01:20
HackerSchool FTZ WARGAME Solution Start : 15.07.03 LEVEL15 [그림 1] hint를 열어보면 [그림 1]과 같이 출력이 되는데 앞에 level14와 코드가 같은 것 처럼 보이나 사실 일부분이 조금 다르다. 우선 check 변수가 int * 형태이며, if에서 check 변수 값과 비교한 것이 아니고, check 변수에 있는 값을 역참조 한 값과 비교한다. [그림 2] gdb로 attackme를 열어보면 [그림 2]와 같이 출력이 되는데 buf 는 level14와 같이 [ebp-56] 부터 시작되고, cmp 를 보면 level14는 eax, 0xdeadbeef 였던 반면 이번엔 [eax], 0xdeadbeef 로 eax의 값을 역참조한 값과 비교하는 것을 확인할..
-
[FTZ]해커스쿨(HackerSchool) LEVEL14 풀이(Solution)미사용/##Security 2015. 8. 15. 01:19
HackerSchool FTZ WARGAME Solution Start : 15.07.03 LEVEL14 [그림 1] hint 를 열어보면 [그림 1]과 같이 출력 된다. 이번에는 이전 문제와는 다르게 fgets 함수를 사용했다. fgets는 입력받을 스트림을 선택할 수 있고, 입력받을 데이터의 크기도 선택할 수 있어 버퍼 오버플로우에 비교적 안전하다고 할 수 있지만 이 문제에서는 본 버퍼의 크기보다 많은 데이터를 입력받을 수 있도록 코딩해두었다. 그리고 이번에는 check 라는 변수에 0xdeadbeef 라는 값이 있어야 상위 권한의 쉘이 실행되도록 코딩이 되어 있다. [그림 2] gdb로 attackme 를 열어보면 [그림 2]와 같이 출력이 되는데 우선 buf는 [ebp-56] 부터 시작되고, ch..
-
[FTZ]해커스쿨(HackerSchool) LEVEL13 풀이(Solution)미사용/##Security 2015. 8. 15. 01:19
HackerSchool FTZ WARGAME Solution Start : 15.07.03 LEVEL13 [그림 1] level13의 hint 파일을 열어 보면 [그림 1]과 같이 출력이 된다. i 라는 long 형태의 변수에 0x1234567 이 저장되고 argv를 통해 전달된 값은 buf 배열에 저장된다. level11과 마찬가지로 strcpy 함수를 이용하기 때문에 main 함수 인자값으로 오버플로우를 일으켜서 RET 를 덮어쓰면 되는데 주의할 점이 변수 i 에 0x1234567 이 없다면 그냥 프로그램이 kill 되어서 강제 종료 되어 버린다. [그림 2] gdb 로 attackme를 열어서 확인해보면 변수 i는 [ebp-12] 영역으로 할당되어 있고, buf 배열은 [ebp-1048] 부터 시작..
-
[FTZ]해커스쿨(HackerSchool) LEVEL12 풀이(Solution)미사용/##Security 2015. 8. 15. 01:18
HackerSchool FTZ WARGAME Solution Start : 15.07.03 LEVEL12 [그림 1] hint 파일을 열어보면 [그림 1]과 같이 attackme 소스 코드가 출력이 된다. 이 프로그램의 특징은 gets 함수로 입력을 받아서 str 배열에 저장하는 방식으로 동작을 한다. level11의 경우 main 함수의 argv 로 값을 받아와서 strcpy 함수로 str 배열에 값을 저장했는데 level12는 그 데이터를 전달받는 방식이 다르다. gets 함수의 경우 사용자가 입력하는데로 크기의 제한 없이 데이터를 변수에 저장시키기 때문에 버퍼 오버플로우 공격에 취약한 함수이다. 그럼 우리가 생각해 볼 수 있는 것은 입력을 변수 공간 만큼 한 다음 RET 값을 쉘 코드가 있는 곳의 ..
-
[FTZ]해커스쿨(HackerSchool) LEVEL11 풀이(Solution)미사용/##Security 2015. 8. 15. 01:17
HackerSchool FTZ WARGAME Solution Start : 15.07.03 LEVEL11 [그림 1] hint 파일을 열어 attackme 프로그램의 소스를 확인 해 보면 main 함수에서 argv 값을 전달받아 str 배열에 복사하는 것을 확인할 수 있다. [그림 2] gdb를 이용해 attackme를 열어보면 sub esp, 0x108 즉 264byte 만큼 메모리 공간을 할당한다. 그리고 strcpy 함수 부분을 보면 [ebp-264]를 인자로 전달을 하는데 이게 곳 str 배열의 시작 주소라는 것을 확인할 수 있다. [그림 3] call strcpy를 하기 직전 stack을 간단하게 그려보면 [그림 3]과 같이 나타내지는데 strcpy 함수로 전달되는 인자값 중에 [ebp+12] ..