webhacking/etc

선린 ctf web

qkqhxla1 2015. 1. 7. 14:15

http://ctf.uproot.co.kr/challenge.php 의 웹문제.



web1

퍼즐을 풀지 말고 소스를 보면.

<script type="text/javascript">

/*<![CDATA[*/

  $(function(){ $('#join_img').attr('src','../images/krystal.jpg');

  $('#join_img').jqPuzzle({rows:6,cols:6,shuffle:true,numbers:false,control:false,style:{overlap:false}});

  hide_pz();});

 function hide_pz(){

  var pz=$('#join_img div'); if(pz[pz.length-2]){$(pz[1]).remove();$(pz[pz.length-2]).remove();}else{setTimeout("hide_pz()",5);}

 }

/*]]>*/

</script>

이라고 나와있는데 빨간색 부분이 의심스럽다. 저기로 들어가보면 클리어.



web2

테트리스게임에서 한번 다 죽어보면 1억점을 넘기라고 한다. 개발자도구를 열어서 보면

Network 카테고리에 흐름이 보인다.


딱 봐도 check.php?score=177부분에서 177점이라는 스코어가 보내지는걸 알 수 있다.

score을 변조해서 보내면 클리어.



web3

링크를 타고 넘어가면 윗동네에서 미제 어른 패드로 접속하라는 글과 함께 현재 국가와 유저 에이전트 정보가 나온다. 윗동네의 구분은 http://121.180.175.72/3pig/pass.php?country=KO 에서의 끝에 get방식으로 넘어가는 country인자로 할테고, 미제 어른 패드는 유저 에이전트를 아이패드? 로 바꿔주면 될것같다. ISO 3166-1에 대해서 찾아보면 북한의 코드는 KP이다. 유저 에이전트를 아이패드로, GET방식으로 저 값을 넘겨주면 통과.



web4

들어가서 소스를 보면 어떤 그림이 나온다. 그림을 열어보면 그냥 전부다 검게 칠해져 있는데 다운로드받아서 그림판으로 연 후, 색 채우기 기능으로 흰색 선택 후 아무곳이나 채우도록 칠해주면 flag가 나타난다. 이게 왜 웹문제인지 모르겠다..



web5

아무거나 계정 가입 후 보면 포인트와 골드로 환전,역환전이 가능한데 힌트를 보면 unsigned int라고 한다. 이건 음수가 없으므로 -1포인트를 환전하겠다고 입력해보면 오히려 돈이 올라간다.

1001포인트를 만든 다음에 전부 다 환전하면 flag를 살 수 있다.



web6

ShowMeTheFlag를 나오게 하면 되는데 특정 키워드를 replace해서 그런지 Show만 입력해보면 글자가 나오질 않는다. XSS에서 하는것처럼 키워드들을 중간에 두번씩 넣어 주면 된다. ShShowowMMeeThTheeFlFlagag



web7

base64로 인코딩 시켜주는 사이트인데 일반적인 base64와는 다르다. 소스를 보면 js로 base64를 구현해놓았다. 근데 힌트를 보면 일반적인 base64와는 base64table만 다르다고 한다. 그럼 나머지 알고리즘은 다 똑같다는 소리이므로 굳이 자바스크립트를 복호화하기보다는(해도 되지만) 내가 새로 base64를 시켜주는 코딩을 한 후 역으로 flag를 인코딩한 값을 집어넣어서 디코딩 시켜주면 된다.

아니면 http://ostermiller.org/calc/encode.html 에서 소스를 받아서(운영진이 여기서 소스 가져온 듯..) base64테이블만 바꿔준뒤 디코딩 해보면 된다.


# -*- encoding: cp949 -*-
import re
b64_table = ['e','0','l','J','K','6','1','v',
    'S','Z','n','k','B','Y','2','f',
    '8','+','D','d','C','R','o','t',
    'b','T','r','p','j','V','L','3',
    's','i','a','F','P','H','q','/',
    'g','I','9','E','Q','y','w','c',
    'x','h','7','O','m','G','M','A',
    '5','U','X','N','4','u','W','z']
base64 = {}; decode_base64 = {}
for i in range(len(b64_table)):
    base64[i]=b64_table[i]
    decode_base64[b64_table[i]]=i


#encode
"""
alpha = 'abcde'
answer = ''; p_answer = []
for i in range(len(alpha)):
    answer += '0'+re.findall('0b(\d+)',bin(ord(alpha[i])))[0]
padding = 24-len(answer)%24; org = len(answer)
if len(answer)%24 != 0:
    for i in range(padding):
        answer += '0'
for i in range(0,len(answer),6):
    if i > org:
        p_answer.append('=')
    else:
        p_answer.append( base64[int(answer[i:i+6],2)] )
print ''.join(p_answer)
"""

p_answer = '+qhiT70Ij70NYJ0mpvZEjGVcboimVMy7r1+QR1+yboZa38=='
#decode
decode = []
for i in range(len(p_answer)):
    if p_answer[i]=='=':
        for i in range(6):
            decode.append('0')
    else:
        decode.append( '%06d' %int(re.findall('0b(\d+)',bin(decode_base64[p_answer[i]]))[0]) )
decode = ''.join(decode); answer = ''
for i in range(0,len(decode),8):
    answer += chr(int(decode[i:i+8],2))
print answer