[FTZ] level19 level19로 로그인한 다음에 문제를 확인해 보았다. 이번에는 코드가 매우 짧다. main() { char buf[20]; gets(buf); printf("%s\n",buf); } 쉘을 획득하기 위해서는 1) 다음레벨인 level20의 uid값인 3100로 uid 변경하여 2) level20의 권한으로 쉘 (/bin/sh) 실행이 필요하다. 하지만, 기존에는 위의 조건의 코드가 주어지지 않았다. 필요한 코드 : setreuid(3100,3100); system("/bin/sh"); 문제해결 방법은, setreuid와 exec("/bin/sh") 이 있는 쉘코드를 환경변수에 넣어 해당 주소를 RET에 덮어쓰면 된다. gdb로 내용을 보면, sub esp,0x28을 통해서 변수를..
[FTZ] level18 level18로 로그인해서 문제를 확인해 보았다. 전에 비해서는 엄청나게 길어진 코드이다.... 코드는 아래와 같다. #include #include #include #include void shellout(void); int main() { char string[100]; int check; int x = 0; int count = 0; fd_set fds; printf("Enter your command: "); fflush(stdout); //출력 버퍼 안에 존재하는 데이터를 즉시 출력함. while(1) { if(count >= 100) printf("what are you trying to do?\n"); if(check == 0xdeadbeef) shellout(); ..
[FTZ] level17 level17로 로그인하고 문제 내용을 보면 다음과 같다. level16 문제와 비슷한데 여기에는 shell함수가 없다. 쉘을 얻기 위해서 다른 곳에서 구해와야 할 것 같다. #include void printit() { printf("Hello there!\n"); } main() { int crap; void (*call)()=printit; char buf[20]; fgets(buf,48,stdin); setreuid(3098,3098); call(); } 코드를 확인해 보면, fgets 함수로 buf 변수가 20bytes이지만, 48bytes까지 입력할 수 있는 길이에 대한 검증이 없어 오버플로우 가능하다. 또한 변수들 중에 void (*call)()=printit;에서 ..
[FTZ] level16 level16으로 로그인해서 문제를 확인해 보았다. 이번에도 버퍼오버플로우로 풀어야 할 문제이다. #include void shell() { setreuid(3097,3097); system("/bin/sh"); } void printit() { printf("Hello there!\n"); } main() { int crap; void (*call)()=printit; char buf[20]; fgets(buf,48,stdin); call(); } 이번에도 쉘을 획득해야 하는데 조금 더 복잡하다. 위의 코드를 보면 main함수에 buf가 20bytes인데, fgets이 buf에 입력값을 받는데 최대 48bytes까지 입력이 가능하다. 이 부분을 이용해서 오버플로우해서 shell..
[FTZ] level15 level15로 로그인해서 문제를 확인해 보았다. level14 문제와 비슷한데, 한 가지 다른 점은 check가 포인터로 할당되어 있는 점이다. 문제를 만족시키기 위해서 check가 들어 있는 메모리 주소값에 0xdeadbeef 가 있는 주소를 넣어 줘야 한다. #include main() { int crap; int *check; char buf[20]; fgets(buf,45,stdin); if (*check==0xdeadbeef) { setreuid(3096,3096); system("/bin/sh"); } } 코드를 확인하면, 문제를 풀기 위해 필요한 정보는 두 가지이다. 1. fgets 함수에서 길이값 검증을 하지 않아 buf의 원래 길이는 20 bytes이지만 최대..
[FTZ] level14 level14 문제를 확인해 보면 버퍼오버플로우나 포맷스트링으로 푸는 문제이다. #include #include main() { int crap; int check; char buf[20]; fgets(buf,45,stdin); if (check==0xdeadbeef) { setreuid(3095,3095); system("/bin/sh"); } } 코드를 확인하면, 문제를 풀기 위해 필요한 정보는 두가지이다. 1. fgets 함수에서 길이값 검증을 하지 않아 buf의 원래 길이는 20 bytes이지만 최대 45 bytes까지 입력 가능하다. 2. 쉘을 획득하기 위해서는 if함수를 통과해야하는데 이를 만족시키기 위해서, check 변수가 0xdeadbeef여야 한다. gdb를 통..
[FTZ] level13 level13으로 로그인하고 문제를 확인해보면 이번 문제도 bof를 하는 문제이다. #include main(int argc, char *argv[]) { long i=0x1234567; char buf[1024]; setreuid( 3094, 3094 ); if(argc > 1) strcpy(buf,argv[1]); if(i != 0x1234567) { printf(" Warnning: Buffer Overflow !!! \n"); kill(0,11); } } 코드를 확인해 보면, i, buf 변수 두 개가 있고, main함수에서 인자를 입력받아서 strcpy로 buf에 넣는다. 이곳이 길이 값을 확인하지 않기 때문에 취약하다. 이 부분을 오버플로우 해서 RET 값을 바꾸면 될..
[FTZ] level12 level12를 엽니다. 이문제도 level11처럼 bof를 이용할 수 있는 문제이다. str 변수에 대해서 gets함수에서 길이 제한 없이 받기 때문이다. str의 길이는 256bytes이지만, gdb로 분석해 보면 264bytes까지 할당되는 것을 통해서 8bytes의 dummy 부분이 있는 것을 알 수 있다. gets으로 변수를 입력받을 때, RET까지 덮어쓰면 가능 할거 같다. level11과 level12의 차이점이라면, level11은 main함수의 인자값으로 받기 때문에 ./attack 인자값으로 바로 전달이 된다면, level12는 main함수가 실행되고 나서 입력값을 넣기 때문에 | (파이프라인)을 이용해야 한다. level11의 환경변수를 이용해서 푼 것과 같은..