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