pwnable.kr

    [Pwnable.kr] cmd1 풀이 (1pt)

    풀이 다은은 cmd1.c의 코드이다. #include #include int filter(char* cmd){ int r=0; r += strstr(cmd, "flag")!=0; r += strstr(cmd, "sh")!=0; r += strstr(cmd, "tmp")!=0; return r; } int main(int argc, char* argv[], char** envp){ putenv("PATH=/thankyouverymuch"); if(filter(argv[1])) return 0; system( argv[1] ); return 0; } filter 함수 매개 변수로 받은 cmd에 flag, sh, tmp라는 문자열이 하나라도 존재한다면 NULL byte를 리턴한다. 즉, flag, sh, tm..

    [Pwnable.kr] lotto 풀이 (2pt)

    풀이 다음은 lotto.c의 코드이다. #include #include #include #include unsigned char submit[6]; void play() { int i; printf("Submit your 6 lotto bytes : "); fflush(stdout); int r; r = read(0, submit, 6); printf("Lotto Start!\n"); //sleep(1); // generate lotto numbers int fd = open("/dev/urandom", O_RDONLY); if (fd == -1) { printf("error. tell admin\n"); exit(-1); } unsigned char lotto[6]; if (read(fd, lotto,..

    [Pwnable.kr] blackjack 풀이 (1pt)

    풀이 blackjack.c의 코드가 어어어어엄청 긴 관계로 취약점이 발견된 부분의 코드만 적어보도록 하겠다. int betting() //Asks user amount to bet { printf("\n\nEnter Bet: $"); scanf("%d", &bet); if (bet > cash) //If player tries to bet more money than player has { printf("\nYou cannot bet more money than you have."); printf("\nEnter Bet: "); scanf("%d", &bet); return bet; } else return bet; } // End Function 음... 딱 감이 오죠? 내가 배팅한 금액이 현재 가지고..

    [Pwnable.kr] shellshock 풀이 (1pt)

    풀이 다음은 shellshock.c의 코드이다. #include int main(){ setresuid(getegid(), getegid(), getegid()); setresgid(getegid(), getegid(), getegid()); system("/home/shellshock/bash -c 'echo shock_me'"); return 0; } 먼저 문제를 풀기 전, 쉘쇼크 취약점에 대해 알아봤다. 쉘쇼크 취약점은 2014년 9월 24일에 발견된, bash shell에 존재하는 보안 취약점이다. 환경변수 값의 유효성 검사를 하지않아 일어나는 취약점이다. 쉘쇼크 취약점 원리에 대한 설명은 다른 곳에 많이 나와있기 때문에 생략하도록 하겠다. ex) 나무위키 아주 간단하게 쉘쇼크 취약점을 공격할 수..

    [Pwnable.kr] mistake 풀이 (1pt)

    풀이 문제 안읽고 그냥 냅다 풀다가 당했다 다음은 mistake.c의 코드다. #include #include #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i 0)){ printf("read error\n"); close(fd); return 0; } char pw_buf2[PW_LEN+1]; printf("input password : "); scanf("%10s", pw_buf2); // xor your input xor(pw_buf2, 10); if(!strncmp(pw_buf, pw_buf2, PW_LEN)){ printf("Password OK\n"); system("/bin/cat flag\n");..

    [Pwnable.kr] leg 풀이 (2pt)

    풀이 2개의 소스 코드가 주어진다. leg.c #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push{r6}\n" "addr6, pc, $1\n" "bxr6\n" ".code 16\n" "movr3, pc\n" "addr3, $0x4\n" "push{r3}\n" "pop{pc}\n" ".code32\n" "pop{r6}\n" ); } int key3(){ asm("mov r3, lr\n"); } int main(){ int key=0; printf("Daddy has very strong arm! : "); scanf("%d", &key); if( (key1()+key2()+key3()) == key ){ printf("Co..

    [Pwnable.kr] input2 풀이 (4pt)

    풀이 문제 길이만 보면 점수 더 줘야지.. 다음은 input.c의 코드이다. #include #include #include #include #include int main(int argc, char* argv[], char* envp[]){ printf("Welcome to pwnable.kr\n"); printf("Let's see if you know how to give input to program\n"); printf("Just give me correct inputs then you will get the flag :)\n"); // argv if(argc != 100) return 0; if(strcmp(argv['A'],"\x00")) return 0; if(strcmp(argv['B']..

    [Pwnable.kr] random 풀이 (1pt)

    풀이 다음은 random.c의 코드이다. #include int main(){ unsigned int random; random = rand(); // random value! unsigned int key=0; scanf("%d", &key); if( (key ^ random) == 0xdeadbeef ){ printf("Good!\n"); system("/bin/cat flag"); return 0; } printf("Wrong, maybe you should try 2^32 cases.\n"); return 0; } 언뜻 보면, random 값은 맨날 바뀌어 정말로 $2^{32}$번의 연산을 해야 하는 듯 보이지만, 과연 그럴까? 결론부터 말하자면, random 값은 바뀌지 않는다. random 값..