문제 페이지로 들어가보면, 해쉬값 같은 것과 입력 필드, 그리고 view-source라는 링크가 보인다.
일단 소스를 보자.
소스가 간단한데, 세션값에 저장된 값을 맞추면 된다.
만약 못맞춘 경우 랜덤값을 8자리 정수에 뒤에 "salt_for_you"라는 문자열을 붙인 뒤 sha1해쉬를 500번 한 뒤 세션값에 저장한다.
그리고 그 저장된 값을 보여준다.
그 저장된 값을 보고 그 값이 500번 sha1 해쉬가 되기 전 값을 알아내서 password에 입력하면 solve(4) 함수가 실행되면서 문제를 풀 수 있게 된다.
이 문제는 기존 webhacking.kr 문제에 조금 변형되어 난이도가 높아진 문제 중 하나인데, 랜덤값 8자리 정수이면 대충90,000,000 = 9천만이다.
보통 알고리즘 문제같은 것을 풀 때, 즉 Problem solving을 할 때 실행시간 측정을 1억번 루프를 도는데 1초 정도로 생각을 한다. 그에 비하면 9천만이면 0.9초 정도에 해당하는데
sha1함수를 500번 하기 때문에 0.9초 * 500 로 대충 계산하면 450초 정도가 된다.
물론 sha1함수는 단순 for-loop보다는 더 복잡하기때문에 10배 정도 복잡하다고 한다면 4500초 정도로 볼 수 있는데, 이는 1시간이 3600초임을 감안하면 2시간이 좀 안되는 시간이라고 볼 수 있다.
즉 모든 경우의 수를 다 해보는 레인보우 테이블을 만드는데 다소 무식해 보이긴 하지만, 시간적으로 해볼만 하다는 뜻이다.
용량적으로 따져보자.
90,000,000Byte는 90,000KB이고 90MB이다.
그리고 각 스트링 값과 해시값이 대충 200byte라고 쳐도 200*90MB = 18000MB = 1.8GB로 스토리지에 저장하기에도 부족함이 없고, 메모리에 올려도 가능하다.
고로 저 해쉬 값들을 모조리 만든 레인보우 테이블로 문제를 풀면 된다.
뭐 쓰레드를 사용하거나 해서 더 빠르게도 가능할 것이고, 스토리지에 Write하는 시간이 Bottle Neck이라면, 메모리에다가만 올리는 방식으로도 가능할 것이다.
'해킹 & 보안 > webhacking.kr' 카테고리의 다른 글
[Rubiya] Webhacking.kr old-31번 문제 풀이 (2) | 2019.10.15 |
---|---|
[Rubiya] Webhacking.kr old-7번 문제 풀이 (0) | 2019.10.14 |
[Rubiya] webhacking.kr old-2번 문제 풀이 (0) | 2019.10.14 |
[Rubiya] webhacking.kr old-18번 문제 풀이 (4) | 2019.10.11 |
[Rubiya] webhacking.kr old-47번 문제 풀이 (0) | 2019.10.11 |