Wargame 🎮/🎡 FTZ

반응형
Wargame 🎮/🎡 FTZ

[FTZ] level20

[FTZ] level20 이제 마지막 문제이다. level20으로 로그인을 한 다음 문제를 보면 다음과 같다. 이번에도 코드만 있는데 #include main(int argc,char **argv) { char bleh[80]; setreuid(3101,3101); fgets(bleh,79,stdin); printf(bleh); } 기존 문제들은 입력값 길이를 넘치게 넣을 수 있어, bof 로 문제를 풀 수 있었는데 이번 문제는 char bleh[80];에 따라 bleh는 80bytes이고 fgets(bleh,79,stdin);으로 79bytes까지만 입력이 가능하기에 bof 공격이 불가능하다. 대신에 printf(bleh); 이부분에서 입력값에 대한 형식(포맷)을 지정해 주지 않았기 때문에 포맷스트링 ..

Wargame 🎮/🎡 FTZ

[FTZ] level19

[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을 통해서 변수를..

Wargame 🎮/🎡 FTZ

[FTZ] level18

[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(); ..

Wargame 🎮/🎡 FTZ

[FTZ] level17

[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;에서 ..

Wargame 🎮/🎡 FTZ

[FTZ] level16

[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..

Wargame 🎮/🎡 FTZ

[FTZ] level15

[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이지만 최대..

Wargame 🎮/🎡 FTZ

[FTZ] level14

[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를 통..

Wargame 🎮/🎡 FTZ

[FTZ] level13

[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 값을 바꾸면 될..

반응형
제나나
'Wargame 🎮/🎡 FTZ' 카테고리의 글 목록