없다.
문제에 들어가면 암호화된 문자열이 있고 그 아래에는 password를 적는 부분이 있다. 그리고 그 야래 링크에 소스코드를 볼 수 있다.
소스 코드는 이렇게 되어 있다.
php 부분을 보면 일단 brute force를 하지 말라고 sleep(1)
이 들어가 있다. sleep(n)
은 n초 만큼 대기한다.
sleep(1); // anti brute force
SESSION['chall4']
에 값이 존재하고 key
값과 chall4
값이 같으면 문제가 풀린다.
if((isset($_SESSION['chall4'])) && ($_POST['key'] == $_SESSION['chall4'])) solve(4);
10000000부터 99999999까지 숫자 중 하나가 들어가고, 그 숫자 뒤에 salt_for_you
가 들어간 상태로 hash
에 저장된다.(ex. 10000000salt_for_you) 그런 뒤에 chall4에 hash값이 저장되고, sha1 암호를 500번 반복 암호화를 시켜서 hash
에 저장한다.
$hash = rand(10000000,99999999)."salt_for_you";
$_SESSION['chall4'] = $hash;
for($i=0;$i<500;$i++) $hash = sha1($hash);
html을 보면 암호화된 문자열은 sha1 암호가 500번 암호화된 값을 나타낸다.
그 아래 password는 key값이 들어간다. 즉 원본 문자열을 찾아서 password에 적으면 문제가 풀린다.
<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>
sha1 암호는 해시로 된 암호로 단방향 알고리즘을 가진 암호이다. 단방향이란 말 그대로 암호화는 가능하지만 복호화는 불가능한 암호를 말한다.
하지만 복호화를 할 수 없다고 문제를 못 푸는 건 아니다. 원본 문자열이 어떻게 되어 있는지 알고 있으니까 그것들을 하나씩 sha1 암호화하여 해당값과 비교해서 값을 찾으면 된다.
일단 암호화를 9천만번 하기에는 너무 시간 낭비이기 때문에 천만번만 한 데이터를 텍스트파일로 저장할 것이다.(천만번만 돌려도 1시간 정도 소요된다.)
일단 sha1암호를 돌리기 때문에 import hashlib
를 사용했다. 그리고 파일로 저장할 거기 때문에 f = open("table.txt", "w+")
를 사용하여 택스트 파일을 만들었다.
import hashlib
f = open("table.txt", "w+")
s1은 숫자 뒤에 있는 문자열이고, s2는 숫자이다. 그리고 s3은 s2과 s1를 더해서 원본 문자열을 만든다. re라는 함수를 따로 만들어서 sha1암호화를 500번 돌릴 때 사용했다.
그리고 f.write
를 이용해서 결과값들을 저장했다.
s1 = "salt_for_you"
for i in range(10000000, 20000000):
s2 = str(i)
s3 = s2 + s1
re = s3
for j in range(0, 500):
re = hashlib.sha1(re.encode()).hexdigest()
print(i)
f.write(s2+"salt_for_you "+re+"\n")
f.close()
그래서 코드는 이렇게 나온다.
import hashlib
f = open("table.txt", "w+")
s1 = "salt_for_you"
for i in range(10000000, 20000000):
s2 = str(i)
s3 = s2 + s1
re = s3
for j in range(0, 500):
re = hashlib.sha1(re.encode()).hexdigest()
print(i)
f.write(s2+"salt_for_you "+re+"\n")
f.close()
이렇게 해서 천만가지(10000000~19999999)의 암호화된 문자열을 텍스트 파일로 얻었다. 이제 문제에서 주어진 암호문을 grep을 이용해서 찾으면 된다. 천만가지만 찾았기 때문에 원본 문자열을 못 찾을 수도 있다.
그렇기 때문에 문제 웹페이지를 새로고침을 해서 다른 암호문을 받아서 찾으면 된다. 총 9~10번 정도 시도 하면 원본 문자열을 찾을 수 있다.
그리고 원본 문자열을 password 칸에 넣고 제출을 하면 문제가 풀린다.