random.c의 소스코드이다.
위의
if( (key ^ random) == 0xdeadbeef) 부분에서 난수값과 key값을 xor연산을 해주어 0xdeadbeef가 되면 flag를 볼 수 있는 것을 알 수 있다.
브레이크 포인트를 4005fc와 400624 두 개를 잡아줬다. 이 두개를 잡은 이유는 난수가 스택에 어떤 위치에 저장이 저장이 되는 지 보기 위해서 이다.
위의 그림을 보면 난수의 값은 0x7fffe95fa1c에 저장된 것을 알 수 있다. 그리고 그 값은 0x6b8b4567이다.
xor연산은 2개의 2진수의 값이 서로 다르면 1 같으면 0이 되는 연산인데 0x6b8b4567은 2진수로 01101011100010110100010101100111이고 0xdeadbeef는 11011110101011011011111011101111이다 따라서 scanf로 key 값을 입력할 때 2진수로 10110101001001101111101110001000을 주면 된다. 그런데 위의 c 코드를 보면 10진수를 입력받게 되어 있으므로 3039230856을 전달하면
flag가 뜨는 것을 알 수 있다.
그런데!!!
여기서 궁금한 점은 난수이면 매번 실행할때마다 바뀌어야 된다고 생각하는데 왜 내가 풀었을때는 그러지 않았을까가 궁금하다....
이 부분에 대해서는 좀 더 알아봐야겠다.
=> rand()함수는 시드라는 것을 바탕으로 값을 순서대로 나오게 한다. 시드에는 여러 값들이 순서대로 정리되어 있다.
ex)
※따라서 프로그램을 몇번 실행하든 rand함수는 시드 순서대로 준다.