int lol = 1; int input = 0; for (int i = 1; i <= 7; ++i) { printf("Enter lucky number #%d:\n", i); scanf("%d", &input); if (rand() != input) { lol = 0; } }
rand()를 예측하면 flag를 획득할 수 있다. 여기서 취약점은 seed가 고정되어 있어서 rand()를 예측할 수 있다. 이를 위해 c파일을 하나 만들어서 예측한 rand() 값을 받아와서 입력으로 넣어주면 될 듯 하다.
Solve
rand()를 예측하기 위해 아래와 같은 c파일을 만들어서 컴파일한다. 우리는 문제 바이너리의 seed값 주소를 구소해서 인자로 넘겨주고 srand() 함수 인자로 사용해야 한다. 그리고 문제 바이너리에서 rand() 값을 7번 맞추는 것을 요구했기 때문에 이것을 그대로 c로 구현해준다. 잊지말아야할 것은 파이썬 스크립트에서 방금 만든 바이너리의 출력값을 받아와야한다는 사실이다.
seed = e.address + 0x4068 print(seed) random = subprocess.check_output(['./a.out', str(seed)]).strip().split(b'\n') random = [int(i) for i in random] print(random)