#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
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, 6) != 6){
printf("error2. tell admin\n");
exit(-1);
}
for(i=0; i<6; i++){
lotto[i] = (lotto[i] % 45) + 1; // 1 ~ 45
}
close(fd);
// calculate lotto score
int match = 0, j = 0;
for(i=0; i<6; i++){
for(j=0; j<6; j++){
if(lotto[i] == submit[j]){
match++;
}
}
}
// win!
if(match == 6){
system("/bin/cat flag");
}
else{
printf("bad luck...\n");
}
}
void help(){
printf("- nLotto Rule -\n");
printf("nlotto is consisted with 6 random natural numbers less than 46\n");
printf("your goal is to match lotto numbers as many as you can\n");
printf("if you win lottery for *1st place*, you will get reward\n");
printf("for more details, follow the link below\n");
}
int main(int argc, char* argv[]){
// menu
unsigned int menu;
while(1){
printf("- Select Menu -\n");
printf("1. Play Lotto\n");
printf("2. Help\n");
printf("3. Exit\n");
scanf("%d", &menu);
switch(menu){
case 1:
play();
break;
case 2:
help();
break;
case 3:
printf("bye\n");
return 0;
default:
printf("invalid menu\n");
break;
}
}
return 0;
}
이런식으로 나온다.
딱히 모르는 내용은 없지만 fflush(stdout)에 대해 다시 정리하자.
출력 스트림(stdout) : 출력 버퍼 안에 존재하는 데이터를 비우는 즉시 출력(버퍼에 있는 데이터를 꺼내 출력장치로 보냄)
그래서 처음에는 버퍼안에 있는 submit을 찾으면 될거라고 생각해서 GDB를 실행시켜보았지만 성과는 없었다. (뭐만하면 GDB를 의심하는 것도 고쳐야 할듯...)
int match = 0, j = 0;
for(i=0; i<6; i++){
for(j=0; j<6; j++){
if(lotto[i] == submit[j]){
match++;
}
}
}
우선 이코드를 보면 36번이나 반복문을 수행한다.
로또번호입력값[i]=메뉴입력값[j] 이므로 둘다 1을 입력해야 된다.
lotto[0] == submit[0~5] 가 되서 111111을 입력하고 lotto[]중에 1이 있을 경우 match의 값은 6이 되어 쉘을 얻을 수 있다.
둘다 unsigned char 형으로 받기 때문에 1을 입력하면 '1'로 인식되어 10진수값으로 49가 된다.
45이하가 되는 문자는 아스키코드표를 참조해야된다.
sorry mom... I FORGOT to check duplicate numbers... :(
'pwnable' 카테고리의 다른 글
[Toddler's Bottle] black jack (0) | 2024.05.11 |
---|---|
[Toddler's Bottle] cmd1 (0) | 2024.05.11 |
[Toddler's Bottle] blukat (0) | 2024.05.11 |
[Toddler's Bottle] leg (0) | 2024.05.11 |
[Toddler's Bottle] input (1) | 2024.05.11 |