우선 첫 화면은 달랑 이것밖에 없었다.

client ip에 내 아이피가 달랑있어서 소스를 켜보았다.

별다른 소스는 없어보였지만

"source : index.php"라는 구문이 보여서 index.php로 들어가 보았다.

그랬더니 소스문을 훤하게 다 보여준다.

REMOTE_ADDR은

사용자가 현재 페이지를 보고 있는 시스템의 ip주소를 나타낸다고 한다.

하지만 ip주소를 바꿀 필요는 없고 cookie에 REMOTE_ADDR가 있다면

거기로 넣어주면 되는데

str_replace로 직접 넣게는 못해놓았다.

그래서 그것만 우회해 주게 cookie값을 넣어주면

무난하게 24번을 클리어!


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

Webhacking.kr 42번  (0) 2017.11.13
Webhacking.kr 26번  (0) 2017.11.12
Webhacking.kr 6번  (0) 2017.10.22
Webhacking.kr 4번  (0) 2017.10.22
Webhacking.kr 20번  (0) 2017.10.16
def BuildGST(pattern, suffix, GST):
    m = len(pattern)
    suffix[m-1= m
    g = m-1
    
    for i in range(m-2-1-1):
        if i > g and suffix[i+m-1-f] < i-g:
            suffix[i] = suffix[i+m-1-f]
        else:
            if i < g:
                g = i
            f = i
            while (g>=0 and pattern[g]==pattern[g+m-1-f]):
                g-=1
            suffix[i] = f-g
            
        for i in range(0,m,1):
            GST[i] = m
            
        j=0
        for i in range(m-1-1-1):
            if suffix[i] == i+1:
                while(j < m-1-i):
                    if GST[j] == m:
                        GST[j] = m-1-i
                    j+=1
        for i in range(0,m-1,1):
            GST[m-1-suffix[i]] = m-1-i
            
def BuildBCT(pattern,BCT):
    
    for i in range(10000):
        BCT.append(-1)
    for i in range(len(pattern)):
        BCT[ord(pattern[i])] = i
 
 
def search(pattern,GST,BCT,text):
    index = []
    m = 0
    t_len = len(text)
    p_len = len(pattern)
    i = p_len - 1
    
    while m+< t_len:
        if pattern[i] == text[m+i]:
            if i == 0:
                index.append(m)
                i = p_len-1
                m += 1
            i -= 1
        else:
            m = m + max(GST[i], i-BCT[ord(pattern[i])])
            i = p_len-1
    return index
if __name__=='__main__':
    pattern = input("Please input the pattern : ")
    print('\n')
    GST = []
    BCT = []
    suffix = []
    leng = len(pattern)
    index_key = 0
    for i in range(len(pattern)):
        GST.append(0)
        BCT.append(0)
        suffix.append(0)
    BuildGST(pattern, suffix, GST)
    BuildBCT(pattern,BCT)
    with open('source.txt') as f:
        line_number = 1       
        for line in f:
            cols = list(line)
            index = search(pattern,GST,BCT,cols)
            if index:
                for index_target in index:
                    index_target = index_target + index_key
                    cols.insert(index_target,'[[')
                    cols.insert(index_target+leng+1,']]')
                    index_key += 2
                index_key = 0
                print(line_number,index,"------")
                for k in cols:
                    print(k,end='')
                print('\n')
            line_number += 1
 
    
              




def make_kmp_table(pattern,border):
    
    m= len(pattern)
    border[0= -1
    border[1= 0
    
    i = 2
    cnd = 0
    
    while(i < m):
        if pattern[i-1== pattern[cnd]:
            cnd += 1
            border[i] = cnd
            i += 1
            
        elif cnd > 0:
            cnd = border[cnd]
            
        else:
            border[i] = 0
            i += 1
 
def kmp_search(pattern, border, text):
    index = []
    m = 0
    i = 0
    t_len = len(text)
    p_len = len(pattern)
    
    while m+< t_len:
        if pattern[i] == text[m+i]:
            if i == p_len-1:
                index.append(m)
                i = 0
                m += 1
            i += 1
        else:
            if border[i] > -1:
                m = m + i- border[i]
                i = border[i]
            else:
                i = 0
                m += 1
    return index
 
if __name__=='__main__':
    pattern = input("Please input the pattern : ")
    print('\n')
    border = []
    leng = len(pattern)
    index_key = 0
    for i in range(len(pattern)):
        border.append(0)
    make_kmp_table(pattern,border)
    with open('source.txt') as f:
        line_number = 1       
        for line in f:
            cols = list(line)
            index = kmp_search(pattern,border,cols)
            if index:
                for index_target in index:
                    index_target = index_target + index_key
                    cols.insert(index_target,'[[')
                    cols.insert(index_target+leng+1,']]')
                    index_key += 2
                index_key = 0
                print(line_number,index,"------")
                for k in cols:
                    print(k,end='')
                print('\n')
            line_number += 1

cs


첫 우선 첫 화면은 이러하다.

그래서 index.phps를 눌러 들어가보니


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?php 
if(!$_COOKIE[user]) 
    $val_id="guest"
    $val_pw="123qwe"
 
    for($i=0;$i<20;$i++
    { 
        $val_id=base64_encode($val_id); 
        $val_pw=base64_encode($val_pw); 
 
    } 
 
    $val_id=str_replace("1","!",$val_id); 
    $val_id=str_replace("2","@",$val_id); 
    $val_id=str_replace("3","$",$val_id); 
    $val_id=str_replace("4","^",$val_id); 
    $val_id=str_replace("5","&",$val_id); 
    $val_id=str_replace("6","*",$val_id); 
    $val_id=str_replace("7","(",$val_id); 
    $val_id=str_replace("8",")",$val_id); 
 
    $val_pw=str_replace("1","!",$val_pw); 
    $val_pw=str_replace("2","@",$val_pw); 
    $val_pw=str_replace("3","$",$val_pw); 
    $val_pw=str_replace("4","^",$val_pw); 
    $val_pw=str_replace("5","&",$val_pw); 
    $val_pw=str_replace("6","*",$val_pw); 
    $val_pw=str_replace("7","(",$val_pw); 
    $val_pw=str_replace("8",")",$val_pw); 
 
    Setcookie("user",$val_id); 
    Setcookie("password",$val_pw); 
 
    echo("<meta http-equiv=refresh content=0>"); 
?> 
 
<html
<head
<title>Challenge 6</title
<style type="text/css"> 
body { background:black; color:white; font-size:10pt; 
</style
</head
<body
 
<? 
 
$decode_id=$_COOKIE[user]; 
$decode_pw=$_COOKIE[password]; 
 
$decode_id=str_replace("!","1",$decode_id); 
$decode_id=str_replace("@","2",$decode_id); 
$decode_id=str_replace("$","3",$decode_id); 
$decode_id=str_replace("^","4",$decode_id); 
$decode_id=str_replace("&","5",$decode_id); 
$decode_id=str_replace("*","6",$decode_id); 
$decode_id=str_replace("(","7",$decode_id); 
$decode_id=str_replace(")","8",$decode_id); 
 
$decode_pw=str_replace("!","1",$decode_pw); 
$decode_pw=str_replace("@","2",$decode_pw); 
$decode_pw=str_replace("$","3",$decode_pw); 
$decode_pw=str_replace("^","4",$decode_pw); 
$decode_pw=str_replace("&","5",$decode_pw); 
$decode_pw=str_replace("*","6",$decode_pw); 
$decode_pw=str_replace("(","7",$decode_pw); 
$decode_pw=str_replace(")","8",$decode_pw); 
 
 
for($i=0;$i<20;$i++
    $decode_id=base64_decode($decode_id); 
    $decode_pw=base64_decode($decode_pw); 
 
echo("<font style=background:silver;color:black>&nbsp;&nbsp;HINT : base64&nbsp;&nbsp;</font><hr><a href=index.phps style=color:yellow;>index.phps</a><br><br>"); 
echo("ID : $decode_id<br>PW : $decode_pw<hr>"); 
 
if($decode_id=="admin" && $decode_pw=="admin"
    @solve(6,100); 
 
 
?> 
 
</body
</html

cs

이런 소스가 있었다.

해석을 해보면 처음에 받은 아이디와 비밀번호를 20번 base64로 인코딩을 해서 

쿠키값에 user와 password에 집어넣고 나서 

화면에 출력을 해줄때에는 20번 다시 디코딩을 하는 것으로 보인다.

그래서 이것이 solve화면을 띄우려면

id와 password를 admin으로 만들어 줘야 한다.

따라서

admin을 base64로 인코딩을 20번 해 보았다.


그랬더니

Vm0wd2QyUXlVWGxWV0d4V1YwZDRWMVl3WkRSV01WbDNXa1JTVjAxV2JETlhhMUpUVmpBeFYySkVUbGhoTVVwVVZtcEJlRll5U2tWVWJHaG9UVlZ3VlZadGNFSmxSbGw1VTJ0V1ZXSkhhRzlVVmxaM1ZsWmFjVkZ0UmxSTmJFcEpWbTEwYTFkSFNrZGpSVGxhVmpOU1IxcFZXbUZrUjA1R1UyMTRVMkpIZHpGV1ZFb3dWakZhV0ZOcmFHaFNlbXhXVm1wT1QwMHhjRlpYYlVaclVqQTFSMWRyV25kV01ERkZVbFJHVjFaRmIzZFdha1poVjBaT2NtRkhhRk5sYlhoWFZtMXdUMVF3TUhoalJscFlZbGhTV0ZSV2FFTlNiRnBZWlVaT1ZXSlZXVEpWYkZKRFZqQXhkVlZ1V2xaaGExcFlXa1ZhVDJOc2NFZGhSMnhUVFcxb2IxWXhaREJaVmxsM1RVaG9hbEpzY0ZsWmJGWmhZMnhXY1ZGVVJsTk5WMUo1VmpKNFQxWlhTbFpYVkVwV1lrWktTRlpxUm1GU2JVbDZXa1prYUdFeGNHOVdha0poVkRKT2RGSnJhR2hTYXpWeldXeG9iMWRHV25STldHUlZUVlpHTTFSVmFHOWhiRXB6WTBac1dtSkdXbWhaTVZwaFpFZFNTRkpyTlZOaVJtOTNWMnhXWVZReFdsaFRiRnBZVmtWd1YxbHJXa3RUUmxweFVtMUdVMkpWYkRaWGExcHJZVWRGZUdOSE9WZGhhMHBvVmtSS1QyUkdTbkpoUjJoVFlYcFdlbGRYZUc5aU1XUkhWMjVTVGxOSGFGQlZiVEUwVmpGU1ZtRkhPVmhTTUhCNVZHeGFjMWR0U2tkWGJXaGFUVzVvV0ZreFdrZFdWa3B6VkdzMVYySkdhM2hXYTFwaFZURlZlRmR1U2s1WFJYQnhWVzB4YjFZeFVsaE9WazVPVFZad2VGVXlkREJXTVZweVkwWndXR0V4Y0ROV2FrWkxWakpPU1dKR1pGZFNWWEJ2Vm10U1MxUXlUWGxVYTFwb1VqTkNWRmxZY0ZkWFZscFlZMFU1YVUxcmJEUldNalZUVkd4a1NGVnNXbFZXYkhCWVZHdGFWbVZIUmtoUFYyaHBVbGhDTmxkVVFtRmpNV1IwVTJ0a1dHSlhhR0ZVVnpWdlYwWnJlRmRyWkZkV2EzQjZWa2R6TVZZd01WWmlla1pYWWxoQ1RGUnJXbEpsUm1SellVWlNhVkp1UW5oV1YzaHJWVEZzVjFWc1dsaGlWVnBQVkZaYWQyVkdWWGxrUkVKWFRWWndlVmt3V25kWFIwVjRZMFJPV21FeVVrZGFWM2hIWTIxS1IxcEhiRmhTVlhCS1ZtMTBVMU14VlhoWFdHaFlZbXhhVjFsc1pHOVdSbXhaWTBaa2JHSkhVbGxhVldNMVlWVXhXRlZyYUZkTmFsWlVWa2Q0YTFOR1ZuTlhiRlpYWWtoQ1NWWkdVa2RWTVZwMFVtdG9VRll5YUhCVmJHaERUbXhrVlZGdFJtcE5WMUl3VlRKMGExZEhTbGhoUjBaVlZucFdkbFl3V25OT2JFcHpXa2R3YVZORlNrbFdNblJyWXpGVmVWTnVTbFJpVlZwWVZGYzFiMWRHWkZkWGJFcHNVbTFTZWxsVldsTmhWa3AxVVd4d1YySllVbGhhUkVaYVpVZEtTVk5zYUdoTk1VcFZWbGN4TkdReVZrZFdiR1JvVW5wc2IxUldXbmRsYkZsNVkwVmtWMDFFUmpGWlZXaExWMnhhV0ZWclpHRldNMmhJV1RJeFMxSXhjRWhpUm1oVFZsaENTMVp0TVRCVk1VMTRWbGhvV0ZkSGFGbFpiWGhoVm14c2NscEhPV3BTYkhCNFZrY3dOVll4V25OalJXaFlWa1UxZGxsV1ZYaFhSbFp5WVVaa1RtRnNXbFZXYTJRMFdWWktjMVJ1VG1oU2JGcFlXV3hhUm1ReFduRlJiVVphVm0xU1NWWlhkRzloTVVwMFlVWlNWVlpXY0dGVVZscGhZekZ3UlZWdGNFNVdNVWwzVmxSS01HRXhaRWhUYkdob1VqQmFWbFp0ZUhkTk1WcHlWMjFHYWxacmNEQmFSV1F3VmpKS2NsTnJhRmRTTTJob1ZrUktSMVl4VG5WVmJFSlhVbFJXV1ZaR1l6RmlNV1JIWWtaV1VsZEhhRlJVVm1SVFpXeHNWbGRzVG1oU1ZFWjZWVEkxYjFZeFdYcFZiR2hZVm14d1lWcFZXbXRrVmtwelZtMXNWMUl6YURWV01XUXdXVmRSZVZaclpGZGliRXB5Vld0V1MySXhiRmxqUldSc1ZteEtlbFp0TURWWFIwcEhZMFpvV2sxSGFFeFdNbmhoVjBaV2NscEhSbGROTW1oSlYxUkplRk14U1hoalJXUmhVbXMxV0ZZd1ZrdE5iRnAwWTBWa1dsWXdWalJXYkdodlYwWmtTR0ZHV2xwaVdHaG9WbTE0YzJOc1pISmtSM0JUWWtad05GWlhNVEJOUmxsNFYyNU9hbEpYYUZoV2FrNVRWRVpzVlZGWWFGTldhM0I2VmtkNFlWVXlTa1pYV0hCWFZsWndSMVF4V2tOVmJFSlZUVVF3UFE9PQ==

이렇게 나왔고 이것을

edit this cookie로 user와 password에 넣어주니

6번 클리어!!!

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

Webhacking.kr 26번  (0) 2017.11.12
Webhacking.kr 24번  (0) 2017.11.12
Webhacking.kr 4번  (0) 2017.10.22
Webhacking.kr 20번  (0) 2017.10.16
Webhacking.kr 54번  (0) 2017.10.16


4번 문제를 시작하니 이런 창이 나왔다.

위에 있는 문장으로 패스워드를 찾는 문제같다.

뭐 이것저것 아무거나 넣어 보아도 반응이 없고

소스코드도 다른 점이 없어보였기 때문이다.

위에 문장은 특이점이 == 이었기 때문에

구글에 ==인코딩이라고 쳐 보니

"http://idchowto.com/php-base64-%EC%9D%B8%EC%BD%94%EB%94%A9%EB%94%94%EC%BD%94%EB%94%A9-%ED%95%A8%EC%88%98%EC%9D%98-%ED%8A%B9%EC%A7%95/"

이 사이트가 나왔는데 굉장히 자세하게 base64를 설명해 놓으셨다.

간락하게 말하자면 8비트인 문자를 6비트로 나누어 암호화 하는 방식으로

남는 비트를 모으면 = 또는 == 가 나오는 것이 특징이다.



그래서 디코딩을 해 보았지만 다른 암호문이 나왔다.

그래서 이것을 여러가지로 디코딩을 해보았는데

인터넷을 뒤지다 보니 sha암호가 특징이 40글자라는 것을 보았는데

이것이 40글자여서 sha1방식으로 디코딩을 해보니

이렇게 변화가 있었다. 그래서 한번더 해 보았더니


정답이 나왔다.

4번도 클리어!!!

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

Webhacking.kr 24번  (0) 2017.11.12
Webhacking.kr 6번  (0) 2017.10.22
Webhacking.kr 20번  (0) 2017.10.16
Webhacking.kr 54번  (0) 2017.10.16
webhacking.kr 10번  (0) 2017.10.15


첫 화면을 보니 nickname 창 comment창 code 창에 어떤 값을  처넣어야 하는 문제이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
function ck()
{
 
if(lv5frm.id.value=="") { lv5frm.id.focus(); return; }
if(lv5frm.cmt.value=="") { lv5frm.cmt.focus(); return; }
if(lv5frm.hack.value=="") { lv5frm.hack.focus(); return; }
if(lv5frm.hack.value!=lv5frm.attackme.value) { lv5frm.hack.focus(); return; }
 
lv5frm.submit();
 
}
</script>



여기서

nickname값이 없으면 다시 return

comment 또한 없으면 안되고

code값은 옆에 나와있는 값이어야 submit이 된다고 한다.

하지만 조건을 만족시켜도 안되는 것을 알 수 있었다.

그래서 보니 time:2가 있는 것을 알 수있었다.

아마 2분이나 2초 안에 해야하는 것 같다.

따라서 콘솔창에

lv5frm.id.value = "1"; lv5frm.cmt.value = "1"; lv5frm.hack.value = lv5frm.attackme.value;ck();

라고 치고 2초안에 해보니 성공!


20번도 클리어!!

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

Webhacking.kr 6번  (0) 2017.10.22
Webhacking.kr 4번  (0) 2017.10.22
Webhacking.kr 54번  (0) 2017.10.16
webhacking.kr 10번  (0) 2017.10.15
Webhacking.kr 12번  (0) 2017.09.24

첫 화면은 이렇게 빈화면이다가

?자리에 여러 숫자와 문자가 하나씩떴다가 사라지고

?만 남는다.

아마 그것들이 곧 비밀번호일 것 같다.

하지만 너무 빨리 지나가기 때문에 먼저 소스를 보았다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<html><head>
<title>Challenge 54</title>
</head>
<body>
<h1><b>Password is <font id="aview">?</font></b></h1>
<script>
function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
 
x=run();
 
function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",100);
if(x.responseText=="") aview.innerHTML="?";
}
 
setTimeout("answer(0)",10000);
 
</script>
 
 
</body></html>




소스를 보니 answer 함수에서 

?m=값으로 넣어주면 안되게 되어 있다.

그리고 x.responseText값을 aview.innerHTML에 넣어주고

그 값을 출력시켜주는 것 같다.

그리고 이제 x.responseText값이 없어지니 그제서야 ?를 띄워주는 소스이다.

따라서 계속 지나가는 값을 다 출력시켜주면 될 것 같다.

따라서 콘솔창에서

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function run(){
  if(window.ActiveXObject){
   try {
    return new ActiveXObject('Msxml2.XMLHTTP');
   } catch (e) {
    try {
     return new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e) {
     return null;
    }
   }
  }else if(window.XMLHttpRequest){
   return new XMLHttpRequest();
 
  }else{
   return null;
  }
 }
 
x=run();
 
function answer(i)
{
x.open('GET','?m='+i,false);
x.send(null);
aview.innerHTML+=x.responseText;
i++;
if(x.responseText) setTimeout("answer("+i+")",100);
}
answer(0);




즉 aview.innerHTML += x.responseText로 고쳐주면

그 값이 출력 될 것이다.

그러면 답이 출력

54번 클리어!!

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

Webhacking.kr 4번  (0) 2017.10.22
Webhacking.kr 20번  (0) 2017.10.16
webhacking.kr 10번  (0) 2017.10.15
Webhacking.kr 12번  (0) 2017.09.24
Webhacking.kr 16번  (0) 2017.09.23


10번 문제를 들어가니 알수없는 이런 화면이 나왔다.

화면에서 읽을 수 있는 것은 O와 buy lotto이다

따라서 소스를 보았다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html><head>
<title>Challenge 10</title>
</head>
 
<body>
<hr style="height:100;background:brown;">
<table border="0" width="900" style="background:gray">
<tbody><tr><td>
<a id="hackme" style="position:relative;left:0;top:0" onclick="this.style.posLeft+=1;if(this.style.posLeft==800)this.href='?go='+this.style.posLeft" onmouseover="this.innerHTML='yOu'" onmouseout="this.innerHTML='O'">O</a><br>
<font style="position:relative;left:800;top:0" color="gold">|<br>|<br>|<br>|<br>buy lotto</font>
</td></tr>
</tbody></table>
<hr style="height:100;background:brown;">
</body></html>
cs

하지만 소스코드중 

onclick="this.style.posLeft+=1;if(this.style.posLeft==800)this.href='?go='+this.style.posLeft"

클릭하면 이동하는 소스가 실행이 안되어서 찾아보니

크롬에서는 실행이 안된다고 해서 익스플러어로 실행해 보니

클릭하면 한칸씩 옆으로 가는 것을 알 수 있었다.

그리고 800에 도달한다면 다른 값이 실행되는 것인데

한클릭에 1이 움직이므로 100으로 바꾸어 해 보았다.


 

그랬더니 클리어!












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

Webhacking.kr 20번  (0) 2017.10.16
Webhacking.kr 54번  (0) 2017.10.16
Webhacking.kr 12번  (0) 2017.09.24
Webhacking.kr 16번  (0) 2017.09.23
Webhacking.kr 14번  (0) 2017.09.23

+ Recent posts