728x90

레인보우테이블이란?

해시값들을 저장한 표

(생략)
<?php
  sleep(1); // anti brute force
  if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4);
  $hash = rand(10000000,99999999)."salt_for_you";
  $_SESSION['chall4'] = $hash;
  for($i=0;$i<500;$i++) $hash = sha1($hash);
?><br>
<form method=post>
<table border=0 align=center cellpadding=10>
<tr><td colspan=3 style=background:silver;color:green;><b><?=$hash?></b></td></tr>
<tr align=center><td>Password</td><td><input name=key type=text size=30></td><td><input type=submit></td></tr>
(생략)

임의의 숫자+salt_for_you 값을 500번 sha1 해시함수에 적용한 결과값을 화면에 출력한다. 우린 임의의 숫자+salt_for_you가 뭐였는지를 맞추는 문제다. 해시값들을 만들어 저장 후 화면에 출력되는 값을 찾아야한다.

#sha1 함수 인자로 대입하려면 바이트 인코딩해야함.encode 함수 인자로 "ascii"나 "utf-8" 전달해도 결과 동일
#sha1 함수 결과는 sha1 HASH object 생성.
#sha1 함수 결과를 다시 sha1 인자로 대입하기 위해 hexdigest함수 사용하여 str(문자열)로 변환. 

import hashlib

f=open("파일명(절대경로)",'w')
for i in range(10000000,20000000):
    h=str(i)+"salt_for_you"
    for _ in range(500):
        h=hashlib.sha1(h.encode('utf-8')).hexdigest()
    f.write(str(i)+"salt_for_you"+'     :     '+h[:8]+'\n')
f.close()

10000000 단위로 파일을 하나씩 만들어서 해시값의 8자리만 저장했다. 총 9개의 파일이 만들어 질 것이다.
10000000~99999999까지 다 만들려면 시간이 오래 걸린다. 어느 정도 타협해서 각 구간마다 몇 개씩만 만드는게 낫다. 그리고 만든 값 중에 일치하는게 나올 때까지 새로운 값을 얻는게 낫다.

같은 것을 찾아서 입력하면 풀린다.

728x90

'webhacking.kr' 카테고리의 다른 글

old-06  (0) 2023.02.18
old-05  (0) 2023.02.18
old-03  (0) 2023.02.17
old-02  (0) 2023.02.06
old-01  (0) 2023.02.06

+ Recent posts