random-test

  • (1) 사물함 번호는 알파벳 소문자 혹은 숫자를 포함하는 4자리 랜덤 문자열
  • (2) 비밀번호는 100 이상 200 이하의 랜덤 정수

소스코드 분석

app.py

  • 앞서 문제 설명에서 사물함 번호는 알파벳 소문자 혹은 숫자를 포함하는 4자리 랜덤 문자열임을 알 수 있었는데요. 사물함 번호(locker_num)에 사용될 수 있는 문자는 abcdefghijklmnopqrstuvwxyz0123456789 총 36개이고 4자리 랜덤 문자열이므로 경우의 수는 36^4 (1,679,616)개 가 됩니다.
  • 1,679,616개는 충분히 브루트포스 공격을 해 볼만한 수이죠?

  • 저는 버프스위트 프로페쇼날이 있기 때문에.. 도-구를 사용해서 진행해보겠습니다.
  • (와다다다다ㅏ 브루트포스 공격중입니다.)
  • 라고 생각을 했는데, 큰 오산이었습니다. 생각보다 큰 수입니다.

  • 다시 코드를 살펴보니 굳이 4자리 랜덤 문자열을 사용할 필요는 없는 것 같습니다.
  • rand_str[0:len(locker_num) 이므로 입력한 값의 자릿수 만큼만 비교할 수 있습니다.
    • 음, locker_num 값으로 1자리 값만 입력하면 맨 앞 첫 글자만 같은지 비교하는거죠.
  • 그러니 1,679,616개의 시도가 아니라, 36번의 시도한 해보면 됩니다.


- 쨘, "l" 문자를 입력하니 `Good` 응답이 출력됐습니다. ![[C9X8S7D6A5ST6WA9-dfb67yd089b67s890dd09b67ys0978-20251103213945635.png]]
  • 2번째 조건문은 조금 더 까다롭습니다.
  • (1) 이번에는 locker_num 값이 정확하게 랜덤 문자열 4개와 일치해야 하고,
  • (2) 패스워드도 100~200 중 일치하는 값을 찾아야 합니다.

  • rand_str 값은 1글자씩 순차적으로 찾아주면 됩니다.
    • 1번째 값은 “l” 이었으니, 2번째 값을 찾고,
    • 2번째 값 찾으면 3번째 값을 찾고, 이후 4번째 값을 찾는 방식입니다.

  • locker_num 값은lt4j 였습니다. 패스워드도 브루트 포스로 구해보겠습니다.
    • (lt4j / 156)
  • 플래그 획득에 성공했습니다.

🐛.. 🐛.. 🐛..


Reference

  1. None