profile image

L o a d i n g . . .

article thumbnail image
Published 2021. 5. 3. 20:28

레인보우 테이블 문제

문제 화면 접속

암호화된 해시를 푸는 문제인 것 같다..

 

source code

 

<?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);
?>
...
<tr><td colspan=3 style=background:silver;color:green;><b><?=$hash?></b></td></tr>

세션값은 10000000, 99999999 사이의 임이의 값 + "salt_for_you"이고, 출력하는 해시값은 sha1을 500번 돌린 값이다.

문제의 핵심은 출력된 해시값을 보고 sha1 알고리즘을 돌리기 전 세션값을 찾는 것이다.

그런데, 해시 알고리즘은 단방향 암호화 기법으로 결과값을 통해 입력값을 알아낼 수 없다.

브루트 포스 공격 또한 막아져있다.

-> 레인보우 테이블을 만들어서 풀어야 한다.

 

단방향 암호화 알고리즘의(=해시 알고리즘) 특징인 '문자열 A를 암호화하면 어떤 경우에도 문자열 B가 된다'는 특징을 이용하여, 특정 문자열들에 대한 암호화를 통해 도출된 결과값들을 모두 저장한 것레인보우 테이블이다. 

 

아예 입력값들을 가능한 범위 내에서 최대한 만들어 단방향 알고리즘을 시킨 뒤 이 결과를 결과값과 비교하도록 만드는 것이다.

 

레인보우 테이블 만드는 파이썬 코드 작성

import hashlib

f = open("rainbowtable.txt",'w')

for i in range(10000000, 100000000):
    session = "%dsalt_for_you" % i
    h = session
    for j in range(0,500):
        h = hashlib.sha1(h.encode('utf-8')).hexdigest()
    data = session + " - " + h + "\n"
    f.write(data)

f.close()

코드를 돌린 결과에서 해당 해시값에 해당하는 세션값을 찾으면 된다.

그런데, cpu 사양에 따라 걸리는 시간이 다른 듯하다.

본인은 너무 오래 걸려서 답을 찾지는 못했다 ㅠㅠ..

'Wargame > Webhacking.kr' 카테고리의 다른 글

[Webhacking.kr] 7번  (0) 2021.05.04
[Webhacking.kr] 6번  (0) 2021.05.03
[Webhacking.kr] 5번  (0) 2021.05.03
[Webhacking.kr] 3번  (0) 2021.05.03
[Webhacking.kr] 1번  (0) 2021.05.03
복사했습니다!