본문 바로가기
ftz 풀이 level20 ftz level20 풀어보겠습니다. 힌트조회 입니다. BOF 문제 인줄 알았는데 fgets으로 받는 크기가 79로 배열크기 보다 작아서 바로 다른 방식으로 넘어갔습니다. FormatString Attack 으로 해보겠습니다. 우선 메모리를 조회해 보겠습니다. 심볼을 막아놓았습니다. 더욱 BOF의 가능성이 희미해졌습니다. 시험삼아 프로그램을 돌려 보았는데 문자는 그대로 출력하나, %x(서식문자)를 넣으니 알 수 없는 값이 출력되었습니다. 이를 포맷스트링 취약점이라고 합니다. 힌트에 보면 printf(bleh); 로 되어 있는데 보통 형식과는 다름을 알 수 있습니다. 보통은 printf("%x", bleh); 이러한 방식으로 써서 bleh의 주소를 넘겨 해당 형식에 맞게 출력하게 되는데, 그냥 전자 처럼 .. 2017. 1. 12.
ftz 풀이 level19 ftz level19 풀어보겠습니다. 힌트조회 입니다. 코드가 생각보다 간단합니다. 배열선언 후 gets 함수로 입력받은 값을 출력하는 프로그램입니다. gets 함수에서 버퍼오버플로 취약점이 있다는 것을 알 수 있습니다. 구조를 한 번 보겠습니다. 메모리 구조를 한번 정리해보면 20(배열)+20(dummy)+4(sfp)+(ret) 44바이트를 건너뛰고 쉘코드 환경변수 주소를 삽입하여 공격해보겠습니다. 환경변수를 설정하였으면 getenv 함수로 주소를 추출합니다. 주소가 나왔으니 공격을 해보겠습니다. 공격하니 권한상승이 이루어지지 않았습니다. 권한 상승을 위해 setreuid 가 필요합니다. level20의 uid는 3100임을 확인하였습니다. setreuid 와 쉘실행을 포함한 쉘코드를 다시 환경변수에 .. 2017. 1. 11.
ftz 풀이 level18 ftz level18 풀어보겠습니다. 힌트조회입니다. attackme의 소스인데 필수적인 몇개만 설명하며 넘어가겠습니다. *FD_SET, FD_ZERO, select() 에 대한 내용은 아래의 URL을 참고하시면 됩니다.http://mintnlatte.tistory.com/313 if(count >= 100) //count가 100이상이면 printf("what are you trying to do?\n"); //문자열 출력 if(check == 0xdeadbeef) //check의 값이 0xdeadbeef 이면 shellout(); //shellout함수 실행(쉘함수) switch(x) //switch case문 { case '\r': //x가 \r 일 경우 아무것도 안함 case '\n': //x가 .. 2017. 1. 8.
ftz 풀이 level17 ftz level17 풀어보겠습니다. 힌트 조회 입니다. , 힌트를 보니 level16 힌트에서 shell() 함수만 빠진 상태 입니다. shell()이 없으니, 생각나는 방법은 환경변수로 쉘코드를 작성해 call() 호출주소에 환경변수 주소를 실행하는 방법을 사용하겠습니다. 메모리 형식이 level16과 거의 비슷하기 때문에 넘어가겠습니다. 환경변수 설정을 해줍니다. 이것도 전에 많이 해보았기 때문에 넘어가겠습니다. 환경변수가 확인되었으면, tmp 디렉터리에 환경변수 주소를 알기위한 코딩을 해주고 주소를 획득 합니다. 40Byte+Shell()주소 형식은 level16과 같기때문에 주소부분에 환경변수 주소를 넣어주면 성공적으로 쉘이 실행됩니다. level17을 풀어보았습니다. 2017. 1. 6.
ftz 풀이 level16 ftz level16 풀어보겠습니다. 힌트조회 입니다. 이번에는 쉘을 획득할 수 있는 함수가 shell() 로 정의 되어 있고 main() 에서는 배열을 선언 후 버퍼 오버플로 취약점이 있는 fgets 함수를 사용하였습니다. 그러나 shell() 을 호출하지 않고 call() 를 호출하여 실행하면 "Hello there!" 문자열을 출력하도록 되게 해놓았습니다. 코드만 봐도 알 수 있듯이 call() 을 호출하는 부분에 shell() 주소를 집어 넣어 shell() 을 실행하여 쉘을 획득하는 방식으로 풀어 보겠습니다. 구조는 전에 레벨과 비슷합니다. 56바이트를 확보하고 0xffffffc8 부터 들어가는데 0xfffffff0 부분에 주소를 넣어서 그 주소를 호출하는 것으로 보아 printit() 가 들어.. 2017. 1. 6.
ftz 풀이 level15 ftz level15 풀어보겠습니다. 힌트조회 입니다. level14와 매우 유사하나 다른점이 있다면 check를 포인터 변수로 선언했다는 점입니다. 그렇다면 deadbeef의 값을 직접 넣어준 level14와 달리 deadbeef를 가르치고 있는 주소의 값을 넣어주면 될거 같습니다.구조를 살펴보겠습니다. 구조는 level14와 거의 같습니다. 0xffffffc8부터 해서 56바이트를 저장하고, 0xfffffff0 에 있는 주소로 가 그 값이 deadbeef 이면 성공적으로 쉘을 실행하는 것입니다. 구조는 level14와 거의 같습니다. 이제 deadbeef가 저장된 주소를 찾아서 값대신 그 주소를 넣어보겠습니다.우선 main을 뒤져 보았습니다. main을 보니 0x80484b0 부분에(빨간 네모박스) .. 2017. 1. 4.