#include <stdio.h>
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;
}
ssh접속해 소스코드를 보면 random한 값을 생성해 우리가 입력한 값과 xor연산을 해 0xdeadbeef값이 나오면 flag를 출력해주는 거같다.
근데 내가 알기론 저렇게 랜덤값을 생성하면 값이 바뀌지않는 걸로 안다.
소스 코드 일부분을 복사해서 실행해보자.
#include <stdio.h>
int main(){
unsigned int random;
random = rand(); // random value!
printf("%d", random);
return 0;
}
kimg00n@kimg00n:~$ ./random
1804289383kimg00n@kimg00n:~$ ./random
1804289383kimg00n@kimg00n:~$ ./random
1804289383kimg00n@kimg00n:~$ ./random
1804289383kimg00n@kimg00n:~$ ./random
1804289383kimg00n@kimg00n:~$ ./random
1804289383kimg00n@kimg00n:~$
? 값이 안변한다.
>>> 1804289383 ^ 0xdeadbeef
3039230856
>>> 1804289383 ^ 3039230856
3735928559
>>> hex(3735928559)
'0xdeadbeef'
xor 연산을 해서 0xdeadbeef가 나오는 키값을 구하자.
3039230856을 입력하면 풀릴거같다.
random@pwnable:~$ ./random
3039230856
Good!
Mommy, I thought libc random is unpredictable...
random@pwnable:~$
EZ
flag = Mommy, I thought libc random is unpredictable...