전체 글 (123) 썸네일형 리스트형 ftz level 16 [level16] 역시 bof 로 보이고, fgets 함수의 취약점을 이용하면 될 것 같다. 20 바이트 크기의 buf 를 할당하고, 사용자로부터 48바이트 만큼의 입력을 받는다. 그리고 printit 의 주소를 출력해주는 실행파일로 보인다. 우리는 위에 보이다시피 shell() 의 주소가 call() 되도록 만들면 쉘을 딸 수 있을 것이다. 하도 많이해서 익숙해진 gdb 로 buf 와 call() 의 거리를 확인해보자. 스택까지 그려보자. 손으로 써서 알아보기 어렵지만, 대충 esp-56(0x38) 이 buf 의 시작주소, esp-16 이 call() 의 시작주소가 된다는 뜻. 즉, esp-16 에 들어간 주소 값이 printit() 의 주소가 된다는 뜻이다. 이자리에 shell() 의 시작주소를 넣고 싶은거니까, sh.. ftz level 15 [level15] 이 문제는 level14 와 정말 비슷해보이지만 차이는 check 라는 포인터 변수가 가리키는 주소의 값이 0xdeadbeed 가 되도록 해야한다. 귀찮으니까 attackme 를 level14/tmp 위치에 복사 시킨후 디버깅해보자. 앞 문제에서 본 결과와 같은 것을 볼 수 있다. 오버플로우 방법은 여러가지가 있을 수 있지만 내가 생각해낸 방법은 바로 check 포인터 자리에 deadbeef 문자열이 들어있는 주소가 오도록 오버플로우 시키는 방법이다. 먼저 strcmp 을 하는 부분에 브포를 걸고 실행시켜서 deadbeef 문자열이 들어있는 곳의 주소를 찾아내자. eip 레지스터(다음 명령어 ) 의 주소값을 출력하기 위해 넉넉히 32개의 16진수로 출력을 해주면, deadbeef 문자열이 담긴 주소 0x.. ftz level 14 [level14] 힌트를 살펴보니, level9에서 "go" 가 원하는 곳에 오도록 하는 문제와 비슷해보인다. 다른 점은 check 가 0xdeadbeef 여야 한다는 것? 입력은 buf 에 버퍼 크기는 20 byte. 사용자로부터 45byte까지 입력 받을 수 있고, check 는 어디에 위치해 있는지 디버깅을 통해 확인해보자. 작성 후 컴파일, 디버깅. 스택으로 확인해보면, buf 는 ebp 보다 56 바이트 위 할당 cmp로 비교되는 check 은 ebp 보다 16 바이트 위 할당 따라서 둘의 차이는 40 바이트가 될 것이다. 페이로드는 40 바이트 만큼 오버플로우 후 0xdeadbeef 를 입력하면 되는 것. (python -c 'print "a"*40 + "\xef\xbe\xad\xde"';cat ) | /hom.. ftz level 13 [level13] 이번에도.. 딱봐도 오버플로우다. 살펴보면 왠지 스택은 low buf i SFP RET high 이런 형태일 것 같고, 아마 if 문에서 i 값이 1234567 인지 확인한 후 맞아야 종료되지 않는 걸로 보아 buf 에 값을 오버플로우 시켜 i 자리에 1234567 이 들어가도록 하는 것 같다. 정확한 바이트 수를 알아내기 위해 /tmp 로 이동 후 똑같이 소스파일 생성, 컴파일, 디버깅을 해보자. 처음 esp 에서 0x418 (1048) 만큼 공간을 할당해주는 부분이 보이고, ebp -12 위치에 0x1234567 인 i 가 할당되어 있는 것을 볼 수 있다. 이를 참고해서 간단하게 스택을 그려보자면, 이런식으로 되는 셈이다. buf[1024] + dummy[12] + i[4] + dummy[8] = 1.. ftz level 12 [level12] 이번 문제도 역시 오버플로우. 왠지 level11 과 버퍼 크기도 동일한게 비슷해보이는데 한번 /tmp 로 이동해 똑같이 .c 파일을 만들고 컴파일 한 후 디버깅해보자. 후후... gets 함수 위험하다고 알려준다. 디버깅해보면, 진짜 level11 이랑 똑같아 보인다. str[256] + dummy[8] + SEP[4] + RET[4] = 272 바이트. 그냥 level1 과 똑같이 환경 변수에 쉘코드를 담은 변수를 선언해두고 해당 주소를 ret 위치에 오도록 264 바이트를 nop 으로 채우고 환경 변수 주소를 입력해주어 실행하자. 환경변수 선언! 을 해야하지만 앞서 level11 에서 만들어뒀으니 패스, 이 후 환경 변수 주소를 출력해주는 실행 파일도 그대로 사용. 알아낸 익스 코드 담긴 환경 변수.. ftz level 11 [level11] 이번에도 힌트는 소스! 딱봐도 strcpy 를 써서 오버플로우 취약점을 이용해서 쉘을 따내는 문제 같다. 한번 ls로 attack 실행파일을 확인하고 실행시켜보자. 세그먼테이션 폴트.. /tmp 로 이동해 힌트의 소스를 긁어 attack.c 를 만들고 컴파일하여 디버깅 해보자. 컴파일까지 해서 gdb 로 확인해보면, 스택의 형태가 아마 0x080483c7 : lea eax, [ebp-264] 에서 264 바이트를 할당해주고 있는 것을 볼 수있고, str 은 256 바이트이기 때문에 둘의 차이인 8바이트가 더미의 크기가 될 것이다. 혹은 0x08048397 : sub esp, 0x108 과 (264) 0x080483a7 : sub esp, 0x8 을 보고 (8) 즉, 총 272 바이트 만큼 스택을 할당해주.. ftz level 10 [level10] 공유 메모리라는 단어가 보이고, key_t 의 값도 주어졌다. 우선 잘 모르겠으니 리눅스 공유 메모리를 구글링해보자. *** ipcs 명령어 : OS에서 프로그램이 사용하는 IPC, 공유메모리, 세마포어를 현황 파악 가능 : 옵션 [IPC 확인] ipcs -q [공유 메모리 (Shared Memory) 확인 ] ipcs -m [세마포어 확인 ] ipcs -s 한번 공유 메모리를 확인해보기 위해 ipcs 명령어를 이용해보자. key 0x0001d6a 가 보이고, 소유자는 root, 허가는 0666, 용량은 1028인 공유메모리가 있는 것을 볼 수 있다. 이 값은 10진수로 환산해보면, 힌트에 주어진 key 값인 7530 인 것을 알 수 있다. 이제 공유 메모리에 접속해서 사용할 수 있도록 함수 shmget.. ftz level 9 [level9] 드디어 bof 가 나오는 것 같다. buf2[10], buf[10] 을 할당하고, 역시 bof 취약 함수인 fgets 를 이용해서 buf 에 문자열 입력을 받는 것을 볼 수 있다. 그리고 system("/bin/bash") 를 실행하는 즉, level10 권한으로 쉘을 여는 부분이 실행되려면, buf2 의 맨 앞 두글자가 "go" 여야한다는 걸 알 수 있다. 스택은 아마 buf buf2 SFP RET 이런 식으로 생성될 것이다. 우리는 buf 에 문자열을 입력해서, buf 의 크기인 10 바이트 보다 더 많은 바이트를 입력해, buf2 의 맨 앞 두글자 자리에 "go" 가 들어가도록 오버플로우 시키면 될 것이다. 한번 buf가 10 바이트니까 10글자를 아무거나 입력하고 마지막에 go 를 입력했지만 역시.. 이전 1 2 3 4 5 6 7 ··· 16 다음