전체 글
[Pwnable.kr] coin1 풀이 (6pt)
풀이 주어진 서버로 접속해보자. 이번 문제는 N개의 코인 속 안에 있는 1개의 위조 코인을 C번의 저울질을 이용해 찾아내는 문제다. 널리 알려져있는 저울 문제는 양팔 저울을 이용하지만 이 문제에서는 한팔 저울을 이용한다. 총 100개의 위조 코인을 발견하면 보상을 얻을 것이라고 한다. 코인 N개에 대해 주어지는 기회 C번은 $C\,=\, log_{2}{n} $다. 이번 문제는 이진 탐색을 이용해 문제를 해결할 수 있다. 다음을 예시로 들어보도록 하자. (코인은 0번부터 시작함) 코인: 100개, 기회: 7번 위조 코인: 87번 first = 코인 시작 넘버, last = 코인 마지막 넘버 1번째 first = 0, last = 50 0 - 50 사이에는 위조 코인이 없음. 2번째 first = 51, l..
[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']..