/ 가 필터링되어있다. export와 PATH또한 필터링되어있어 우회하기 힘들것 같다.


삽질한 결과 \57 가 echo로 바뀐다는 것을 알 수 있었다.


페이로드를 구성하자면 다음과 같다.




'pwnable > pwnable.kr' 카테고리의 다른 글

pwnable.kr -input  (0) 2016.12.16
pwnable.kr -coin1  (0) 2016.12.16
pwnable.kr -blackjack  (0) 2016.09.26
pwnable.kr -cmd1  (0) 2016.09.25
pwnable.kr -lotto  (0) 2016.09.25

<blackjack.c>

http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html


일단 소스가 무진장 길다.


취약점을 찾기 위해 돈을 입력하는 부분을 확인해보자.




if문을 통해서 한번만 검증하기 때문에 돈을 크게 넣고 이기면 될것 같다.

음수 값을 넣고 게임을 지는것도 하나의 방법이 될 수 있겟다. ㅇㅅㅇ ㅎㅎ



앙 기모띠 게임은 재밌다.

'pwnable > pwnable.kr' 카테고리의 다른 글

pwnable.kr -coin1  (0) 2016.12.16
pwnable.kr -cmd2  (0) 2016.09.28
pwnable.kr -cmd1  (0) 2016.09.25
pwnable.kr -lotto  (0) 2016.09.25
pwnable.kr -leg  (0) 2016.09.25


flag, sh, tmp 라는 문자열을 필터링한다.


흠 환경변수를 이용하면 될것같다.



mommy now I get what PATH environment is for :)


이것은 cmd2 의 password 이니 기억해두자.

'pwnable > pwnable.kr' 카테고리의 다른 글

pwnable.kr -cmd2  (0) 2016.09.28
pwnable.kr -blackjack  (0) 2016.09.26
pwnable.kr -lotto  (0) 2016.09.25
pwnable.kr -leg  (0) 2016.09.25
pwnable.kr -random  (0) 2016.09.25
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <fcntl.h>  
  5.   
  6. unsigned char submit[6];  
  7.   
  8. void play(){  
  9.       
  10.     int i;  
  11.     printf("Submit your 6 lotto bytes : ");  
  12.     fflush(stdout);  
  13.   
  14.     int r;  
  15.     r = read(0, submit, 6);  
  16.   
  17.     printf("Lotto Start!\n");  
  18.     //sleep(1);  
  19.   
  20.     // generate lotto numbers  
  21.     int fd = open("/dev/urandom", O_RDONLY);  
  22.     if(fd==-1){  
  23.         printf("error. tell admin\n");  
  24.         exit(-1);  
  25.     }  
  26.     unsigned char lotto[6];  
  27.     if(read(fd, lotto, 6) != 6){  
  28.         printf("error2. tell admin\n");  
  29.         exit(-1);  
  30.     }  
  31.     for(i=0; i<6; i++){  
  32.         lotto[i] = (lotto[i] % 45) + 1;     // 1 ~ 45  
  33.     }  
  34.     close(fd);  
  35.       
  36.     // calculate lotto score  
  37.     int match = 0, j = 0;  
  38.     for(i=0; i<6; i++){  
  39.         for(j=0; j<6; j++){  
  40.             if(lotto[i] == submit[j]){  
  41.                 match++;  
  42.             }  
  43.         }  
  44.     }  
  45.   
  46.     // win!  
  47.     if(match == 6){  
  48.         system("/bin/cat flag");  
  49.     }  
  50.     else{  
  51.         printf("bad luck...\n");  
  52.     }  
  53.   
  54. }  
  55.   
  56. void help(){  
  57.     printf("- nLotto Rule -\n");  
  58.     printf("nlotto is consisted with 6 random natural numbers less than 46\n");  
  59.     printf("your goal is to match lotto numbers as many as you can\n");  
  60.     printf("if you win lottery for *1st place*, you will get reward\n");  
  61.     printf("for more details, follow the link below\n");  
  62.     printf("http://www.nlotto.co.kr/counsel.do?method=playerGuide#buying_guide01\n\n");  
  63.     printf("mathematical chance to win this game is known to be 1/8145060.\n");  
  64. }  
  65.   
  66. int main(int argc, char* argv[]){  
  67.   
  68.     // menu  
  69.     unsigned int menu;  
  70.   
  71.     while(1){  
  72.   
  73.         printf("- Select Menu -\n");  
  74.         printf("1. Play Lotto\n");  
  75.         printf("2. Help\n");  
  76.         printf("3. Exit\n");  
  77.   
  78.         scanf("%d", &menu);  
  79.   
  80.         switch(menu){  
  81.             case 1:  
  82.                 play();  
  83.                 break;  
  84.             case 2:  
  85.                 help();  
  86.                 break;  
  87.             case 3:  
  88.                 printf("bye\n");  
  89.                 return 0;  
  90.             default:  
  91.                 printf("invalid menu\n");  
  92.                 break;  
  93.         }  
  94.     }  
  95.     return 0;  
  96. }  


소스코드를 살펴보면 6개의 랜덤한 숫자를 맞추는 문제이다.


하나를 맞출때마다 match++ 로 카운트 하며 match==6일때 플래그를 출력한다.


카운트 하는동안 랜덤값을 기준으로 입력받은 값을 단순 반복하여 비교한다.


여기서 코드상으로 취약점이 발생할 것 같다. 입력한 값이 동일한 값으로 6개가 들어간다면 하나의 숫자만 매칭이 되어도 6이 될 것이다.


char 형 변수로 입력을 받기 때문에 decimal 값으로 입력이 들어갈 것이다.



1~45 사이의 ASCII code를 참고하여 33 ~ 45 사이의 숫자를 갖는 문자 6개를 대입해보면 될것 같다.



앙 기모띠

'pwnable > pwnable.kr' 카테고리의 다른 글

pwnable.kr -blackjack  (0) 2016.09.26
pwnable.kr -cmd1  (0) 2016.09.25
pwnable.kr -leg  (0) 2016.09.25
pwnable.kr -random  (0) 2016.09.25
pwnable.kr -passcode  (0) 2016.09.24

+ Recent posts