#include <stdio.h>
int main(){
unsigned int random;
random = rand(); // random value!
unsigned int key=0;
scanf("%d", &key);
if( (key ^ random) == 0xcafebabe ){
printf("Good!\n");
setregid(getegid(), getegid());
system("/bin/cat flag");
return 0;
}
printf("Wrong, maybe you should try 2^32 cases.\n");
return 0;
}
random에 rand() 함수 결과를 저장하고 사용자의 입력값과 xor해서 나온 결과를 0xcafebabe랑 비교해서 일치하면 flag를 출력한다.
근데 rand 함수는 seed값을 바탕으로 랜덤 값을 생성하는데 시드를 설정하는 과정이 어디에도 없어, 컴파일러는 srand(1)을 한 것으로 취급하고 항상 고정인 랜덤 값이 나온다.
이건 ssh port 환경에도 host 환경에도 똑같기 때문에 그냥 출력해보면 1804289383이 나오고 0xcafebabe랑 xor해보면 입력해야 할 값을 구할 수 있다.
-1586102311 넣어주면 flag이 잘 출력된다.
안전하게 rand함수를 쓸려면, seed 값으로 time과 같이 정말 임의의 숫자를 넣어주어야 한다.
근데 srand도 seed값을 알거나, 시드로 사용한 time이 같은 경우 랜덤 값이 정해진다는 문제점ㅇ이 생겨, 

랜덤 값을 원하는 경우 CSPRNG(cryptographically secure PRNG)를 사용하는 방법이나, 운영 체제가 제공하는 /dev/random을 이용하여 추출하는 방법도 있다.