Random 함수는 실제로 랜덤 할까?
Tenable ctf에서 Random Encryption Fixed 라는 문제를 풀었다. write-up을 바로 작성 했어야 했는데 밀린 과제처럼 미루다가 이제는 귀찮아서 작성하기 싫어졌다…. 아무튼 거두절미하고 문제의 핵심은 random() 함수의 seed값이 동일하면 어떠한 환경에서든 동일한 random 값이 나오게 된다.
여기까지는 사실 학부 수업에서 모두가 거쳐가는 과정이다. 그런데 여기서 떠오르는 의문이 있다. 혹시 같은 seed로 계속해서 랜덤값을 출력하다 보면 나오는 값이 주기성을 띄거나 패턴, 편향이 있지 않을까 하는 의문이다. 이러한 것을 알아보는데에는 random() 함수를 직접 까보는 방법이 있지만 Pass!(못합니다.)
그래서 어떤 방법이 있을까 고민한 결과가 압축이 전혀 되어있지 않은 BMP파일 포맷이 되시겠다. random()으로 RGB(의 R값)을 채워주어 거시적으로 보는 똑쟁이 발상.
우선 BMP 파일 헤더를 알아보았다. 거 걍 대충 쓱 훑어보니 54Byte에다가 중간에 Width, Height 정보가 담겨있다. 귀찮으니 G1bb0n씨한테 윈도우 그림판으로 해상도 맞춰서 보내달라 하고 File Header만 쓱 잘라왔다.
사실 24번째 줄에 rand()%256을 할게 아니라 rand()*256/[rand()의 MAX값]을 해주는게 맞지만 MAX값 검색 의지도 없고 이럼 편향이 도드라지겠지 ㅎㅋ 하는 생각에 요로케 썼다.
아래는 실행 결과 되시겠다.
오오오…. 아주 고르게 잘 나오네요… 혹시 좀 더 거시적으로 보면 다를까…? 해상도를 수십배로 늘려보았다. 파일 용량이 무려 900MB가 나온다. 한번 열어 볼까…?(두근)
그저 Red…
그러나 확대를 해보면 색다른 결과가 나온다.
결론 : 고르게 잘 나오네요. 시드값만 잘 설정해서 써줍시다.
그래도 추 후 시간이 나게 되면 다른 random 알고리즘과 고르기 차이를 비교해 봐야겠다.