카테고리 없음

old-4

cyanhe_wh 2020. 2. 19. 15:56
반응형

[그림 1-1] old-4 문제 페이지

문제에 이상한 암호문과 Password 제출하는 부분 그 아래 좀 작고 어둡게 나와있지만 view-source 링크가 나와있다.

한번 링크를 클릭해 살펴보자!

[그림 1-2] view-source 페이지

view-source 페이지를 클릭해 보면 해당 페이지의 php 소스가 나온다. 첫 번째 php 코드 부분은 그냥 view-source를 보여주는 부분이니 패스 두 번째 php 소스를 보면 solve(4) 부분을 볼 수 있다. 그렇다는 것은 이 부분을 분석해 우회하면 된다는 것이다.

php 코드 부분을 살펴보면 

sleep(1) 이 나온다 이 부분은 일부로 Password 입력하는 부분에 무작위로 값을 대입하는 것을 막기 위해 1초씩 딜레이를 걸었다.

두 번째 if 문에 isset함수와 key 부분(입력받은 Password)과 세션 값이 같아 참이면 들어가 문제를 풀게 만들었다.

isset 함수는 함수 이름 그대로 값이 세팅돼있는지 여부를 판단하는 함수이다. 만약 세션 값이 있으면 1을 반환하고 아니면 0을 반환한다.

그 아래 코드를 보면 

hash 변수에 rand 함수를 이용해 10,000,000부터 99,999,999까지 랜덤으로 하나를 뽑아 그 값과 "salt_for_you" 문자열을 합쳐 넣는다. 그 값을 세션에 넣는다.

그리고 hash 값을 sha1 해시함수로 500번 암호화를 한다... 그리고 그 암호화한 값을 [그림 1-1] 처음에 본 페이지에 보여준다... 이 문제를 풀기 위해서는 500번 암호화한 값을 이용해 session 값을 알아내야 한다.

 

sha1은 해시이므로 복호화가 불가능하다. 그래서 레인보우 테이블을 만들어 해당 문제로 주어지는 해시값을 테이블에서 찾아 평문 값을 구할 것이다. (레인보우 테이블에는 평문과 마지막 해시값만 출력하게 할 것이다)

[그림 1-3] 레인보우 테이블 만들 코드

위 코드를 이용해 텍스트 파일에 테이블을 만들 것이다.

[그림 1-4] 레인보우 테이블

코드를 돌려 위 그림과 같이 테이블이 만들어진 것을 알 수 있다. 이제 이 테이블에서 문제에서 주어진 해시 값을 찾아내면 된다. (실제 위 코드를 돌려보면 데이터가 너무 많아 오래 걸린다. 필자는 계속 만들면서 페이지를 새 로고 치며 바뀐 해시값들을 계속 찾았다.)

[그림 1-5] 해시 값 찾기 완료

이렇게 해서 주어진 해시 값을 테이블에서 찾아 해당 평문 값을 구해냈다.

[그림 1-6] 문제 풀기 완료

찾은 평문 값을 넣어 문제를 해결하였다.

반응형