본문 바로가기

Hackerschool FTZ Write-up

(21)
FTZ Level20 Write-up(FTZ Level20 풀이) 우와~~~ 마! 지! 막! 문제입니다 ㅎㅎ 역시 마지막 문제 답게 시간이 엄청 걸렸네요 ㅠㅠ 문제부터 보시죠! 문제가 심상치가 않습니다! 문제를 보니 버퍼는 80으로 선언되어있고 이번엔 fgets함수에서 길이 체크를 하는군요! 이 문제는 BOF가 아닌 FSB 즉! 포맷 스트링 버그를 이용해야 합니다. 혹시나 포맷 스트링을 모른다면 검색후에 다시 재 도전해보시길 바랍니다. ※포맷 스트링의 원리 및 해설은 자세하게 하지 않도록 하겠습니다. 이미 여러 문서에서 포맷스트링에 대한 이야기를 다루고 있으므로 저는 포맷스트링시에 몰랐던 부분에 대해 설명을 하도록하겠습니다. 정말로 시작해보죠!우선 자연스럽게 이제 gdb를 열어 스택의 구조가 어떻게 되는지 보기 위해 열려고 했으나 main의 symbol이 존재하지 않는..
FTZ Level19 Write-up(FTZ Level19 풀이) 대망의 19번 입니다! 점점 문제가 갈수록 불친절해지는 것 같은건 기분탓... 인가요? 문제를 보면 이번엔 아무것도 없이 buf만 입력받고 땡이네요! 그래도 attackme파일엔 setuid가 설정이 되어있는데 예전엔 보이던 /bin/sh실행 명령어와 setrueid가 보이지 않아요.. 그러면 우리가 만들어 줘야 겠군요! 일단 리턴 어드레스 확인을 위해 아래와 같이 명령어를 작성하였는데 44번째에서 Segemantation Fault가 뜨는 것을 보니 저기가 리턴어드레스 주소인가보군요! 자 그러면 우리는 seteruid및 /bin/sh실행을 위한 쉘코드를 작성하여야 합니다. 이전까지 /bin/sh쉘코드는 많이 이용 하셨을 것이라 생각합니다. 그래서 이번엔 setreuid에 대한 쉘코드를 만들어 볼게요! ..
FTZ Level18 Write-up(FTZ Level18 풀이) 안녕하세요! 문제 18번 입니다! 이번 문제는 조금 특별한 문제이네요! BOF가 아닌... BUF이네요! 즉, 버퍼를 오버시키는 것이 아닌 버퍼를 언더 시키는 것이 목적인 문제 였습니다! 같이 문제를 보도록 하죠! 힌트 부터 무지막지하게 기네요. Key는 check의 값을 deadbeef로 만들면 shellout함수가 실행되며 권한 상승이 이루어 집니다!여기서 당황 했네요. 길게 장황하게 적어져있지만 결국엔 입력을 하나 받아 1크기(char)만큼 x의 주소에 담는 scanf같은 함수입니다. 다른점이있다면 이건 하나씩 루프가 진행되며 string에 담는 다는 것 정도 일까요? x의 값이 \r또는 \n 그러니까 개행 문자이면 그냥 \a를 출력하고 끝나네요! 위의 값에 대해 잘 모르시는 분들께서는 Crarri..
FTZ Level17 Write-up(FTZ Level17 풀이) 17번 입니다! 뭔가 문제가 이전에 풀었던 문제들이랑 비슷비슷해서 속도가 많이 나는 것 같네요! 가보시죠! 이번엔 이전문제와는 달리 함수조차도 주지 않았네요.. 다행이 setreuid를 통해 권한은 설정해 주었으니 저희가 할일은 /bin/sh을 실행시키는 것인데.. 어디서 많이 해봤죠? 자연스럽게 gdb로 가줍니다! 늘 그랬듯 함수의 인자를 통해 변수의 주소를 알아오면 ~ c8은 buf이네요!마찬가지로 f0은 함수 포인터 변수 call이네요! 그리고 예전에 썼던 eggshell을 통해 /bin/sh을 실행시켜줄 수 있도록 하겠습니다! 오랜만에 보니 반갑네요. 그리고 그 주소를 이용해 공격 코드를 아래와 같이 작성해줍니다! eggshell에 대한 정보는 문제 11번에서 자세히 다루었습니다. 이해가 안되신다..
FTZ Level16 Write-up(FTZ Level16 풀이) 정말로 끝이 보이기 시작하네요! 16번 입니다! 힌트를 보니 printit의 함수를 포인터 형태로 저장하여 마지막에 call()을 통해 포인터에 저장된 함수를 call하네요! 원래대로라면 Hello there!이 출력되는 함수가 실행되어야 하지만 그 위에 의심스러운 함수가 있네요! 자연스럽게 gdb를 사용하여 main의 코드를 볼까요! fgets의 인자로사용하는 저 c8의 주소가 buf의 주소이겠네요! 그리고 마지막에 어떠한 주소를 저장하고 call을하는 저 주소가 바로 call의 변수 이겠네요! 역시 차이는 0x28만큼 납니다! 그리고 우리는 여기서 shell 함수의 주소를 찾기 위해 아래와 같이 명령어를 입력하면 친절하게 gdb가 시작주소를 알려줍니다! (gdb) disass shell 만세! 그리고..
FTZ Level15 Write-up(FTZ Level15 풀이) 안녕하세요. 벌써 15번이네요! 끝이보입니다!!!!! 시작해보죠!! check의 주소에 있는 값과 0xdeadbeef를 비교하여 같다면 자동으로 레벨 16의 쉘을 주는 간단한 문제입니다!메모리 구조를 봐야하기 때문에 gdb로 해당 프로그램을 실행시켜 줍니다! 이전의 프로그램들은 gdb의 권한을 막아둔 것 같던데 이번 문제부터는 아마 gdb가 가능하도록 해놓은 것 같네요! 이것때문에 삽질을 ㅠㅠ 이전 문제에서 그래 왔듯 함수의 인자값을 넘겨주는 것으로 변수의 주소를 추측해 보도록 하겠습니다. fgets의 인자로 주는 저 주소는 buf라고 예측할 수 있습니다. 그리고 0xdeadbeef와 비교하는 저 주소의 값은 check라고 예측할 수 있겠군요! 그리고 deadbeef라는 값을 메모리 어딘가에 넣어야하는데..
FTZ Level14 Write-up(FTZ Level14 풀이) 안녕하세요!!!! 벌써 14번이네요 ㅎㅎㅎ 시작하죠! 이번에는 check의 값을 0xdeadbeef로 초기화하는 문제이네요! 저번 문제를 자의로 푸셨으면 쉬울 것이라 생각합니다.우선 스택의 분석을 위해서 tmp폴더에 복사한 후 gdb로 열어서 보게 되면 deadbeef와 비교하는 저부분이 check의 주소라는 것을 추론할 수 있습니다. 그리고 fets을 부르기 전 인자로 전달하는 저 주소는 buf라는 것을 짐작할 수 있죠! 그래서 주소의 차이를 계산해 보면 f0 - c8 = 0x28이라는 것을 알 수 있습니다. 즉, 버퍼에 0x28(40)만큼 채운 후 그 뒤 값을 deadbeef로 채우면 될 것 같군요.그래서 아래와 같이 코드를 작성 할 수 있습니다. 마찬가지로 프로그램 실행 후 버퍼의 값을 입력 받으므..
FTZ Level13 Write-up(FTZ Level13 풀이) 문제 13번 입니다! 힌트를 보니 특이한 코드가 보이는군요! i가 16진수 값 1234567로 초기화가 되어있고 문자를 입력 받은 후 i를 체크하여 값이 변했다면 프로그램을 종료시키는군요! 문제를 미뤄보아 buf의 스택 밑에 i가 위치하고 i의 값을 0x1234567로 변하지 않게 또는, 0x1234567로 초기화를 시켜주어야 겠군요! 오버플로우 위해서 값 입력은 필수적이니 변하지 않게 할 수는 없을 것 같습니다. 따라서 i의 주소에는 다시 0x1234567로 초기화를 시켜주도록 하죠! 저기 있는 if문을 우회하기 위해서요!먼저 스택을 보기위해 gdb를 사용합니다. gdb를 사용하기 위해 위 코드를 아래 명령어로 복사하여 디버깅 옵션을 주어 컴파일 해보죠! $ cp hint tmp/attackme.c$ ..