Description

Category: Web

Source: webhacking.kr

Points: 100

Author: Jisoon Park(js00n.park)

Description:

Write-up

이름부터 친절하게 SQL INJECTION 문제이다.

출제자가 매우 친절한지 소스코드 링크까지 바로 보여준다. 봐주는게 예의.

<html> 
<head> 
<title>Challenge 18</title> 
<style type="text/css"> 
body { background:black; color:white; font-size:10pt; } 
input { background:silver; } 
a { color:lightgreen; } 
</style> 
</head> 
<body> 
<br><br> 
<center><h1>SQL INJECTION</h1> 
<form method=get action=index.php> 
<table border=0 align=center cellpadding=10 cellspacing=0> 
<tr><td><input type=text name=no></td><td><input type=submit></td></tr> 
</table> 
</form> 
<a style=background:gray;color:black;width:100;font-size:9pt;><b>RESULT</b><br> 
<? 
if($_GET[no]) 
{ 

if(eregi(" |/|\(|\)|\t|\||&|union|select|from|0x",$_GET[no])) exit("no hack"); 

$q=@mysql_fetch_array(mysql_query("select id from challenge18_table where id='guest' and no=$_GET[no]")); 

if($q[0]=="guest") echo ("hi guest"); 
if($q[0]=="admin") 
{ 
@solve(); 
echo ("hi admin!"); 
} 

} 

?> 
</a> 
<br><br><a href=index.phps>index.phps</a> 
</cener> 
</body> 
</html> 

텍스트박스로 입력하는 값이 no로 넘어간다. 1을 넣어보면 'hi guest'라는 메세지가 나오는 것으로 보아, guest의 no는 1인걸 알 수 있다.

admin의 no는 아마도 0이거나 2일 것이다. admin 계정을 얻기 위해서는 sql query의 where 절에 "... or id=0" 정도의 문자열을 넣어줘야 할텐데, fetch 바로 윗 라인에 필터링 구문이 있다.

sql 쿼리에서 공백을 대체하는 문자로는 (0x0a), (0x09), (0x0d), /**/, (), + 등이 있다고 하는데, 필터링 구문에서 걸러내는 문자열을 제외해서 대충 아무거나 넣어보면 될것 같다.

만만한 사용해보자. 문자열을 그대로 텍스트박스에 넣으면 %5Cn로 인코딩되어 전송되므로, 특수문자 전송을 위해 주소표시줄에 %0a으로 URL 인코딩한 문자열을 보낸다.

원래 뭐라고 나왔었는지는 기억이 안난다.(...)

'writeups > Web' 카테고리의 다른 글

webhacking.kr 024  (0) 2019.11.25
webhacking.kr 020  (0) 2019.11.25
webhacking.kr 017  (0) 2019.11.25
type confusion  (0) 2019.11.25
webhacking.kr 006  (0) 2019.11.25

Description

Category: Web

Source: webhacking.kr

Points: 100

Author: Jisoon Park(js00n.park)

Description:

Write-up

14번 문제와 생긴게 동일하다. 일단 소스 코드를 열어보자.

<html>
<head>
<title>Challenge 17</title>
</head>
<body bgcolor=black>
<font color=red size=10></font>
<p>
<form name=login>
<input type=passwd name=pw><input type=button onclick=sub() value="check">


</form>



<script>

unlock=100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10+100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10-100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10+9999999999;

function sub(){ if(login.pw.value==unlock){ alert("Password is "+unlock/10); }else { alert("Wrong");  }}
</script>

unlock 변수의 값을 계산해야 하나보다.

수식을 열심히 계산해도 되지만, 시간을 절약하는 의미에서 chrome 도구의 javascript 콘솔을 이용해본다.

얻어낸 값을 넣어주면 password를 알아낼 수 있다.

14번 문제와 동일하게 이 password를 문제목록 상단의 링크를 이용해 auth에 가서 넣어주면 점수를 획득할 수 있다.

'writeups > Web' 카테고리의 다른 글

webhacking.kr 020  (0) 2019.11.25
webhacking.kr 018  (0) 2019.11.25
type confusion  (0) 2019.11.25
webhacking.kr 006  (0) 2019.11.25
webhacking.kr 016  (0) 2019.11.25

Description

Category: Web

Source: webhacking.kr

Points: 100

Author: Jisoon Park(js00n.park)

Description:

Write-up

문제 페이지를 열어보면 처음에 큰 별 하나와 작은 별 하나가 보인다. 키보드로 아무 글자를 입력하면 별이 늘어나고, 늘어난 별에 커서를 갖다대면 별이 사라진다.

잘 모르겠으니, 일단 소스 코드를 열어보자.

<html>
<head>
<title>Challenge 16</title>
<body bgcolor=black onload=kk(1,1) onkeypress=mv(event.keyCode)>
<font color=silver id=c></font>
<font color=yellow size=100 style=position:relative id=star>*</font>
<script> 
document.body.innerHTML+="<font color=yellow id=aa style=position:relative;left:0;top:0>*</font>";

function mv(cd)
{
kk(star.style.posLeft-50,star.style.posTop-50);
if(cd==100) star.style.posLeft=star.style.posLeft+50;
if(cd==97) star.style.posLeft=star.style.posLeft-50;
if(cd==119) star.style.posTop=star.style.posTop-50;
if(cd==115) star.style.posTop=star.style.posTop+50;
if(cd==124) location.href=String.fromCharCode(cd);
}


function kk(x,y)
{
rndc=Math.floor(Math.random()*9000000);
document.body.innerHTML+="<font color=#"+rndc+" id=aa style=position:relative;left:"+x+";top:"+y+" onmouseover=this.innerHTML=''>*</font>";
}

</script>
</body>
</html>

mv와 kk 함수 두가지가 있는데, 천천히 살펴봐도 뭔가 취약점이라던가 하는건 없어 보인다.

mv 함수에서 key code에 따라 특정한 동작을 하는 if문들이 있는데, key code가 124이면 다른 페이지로 이동하도록 되어있다.

javascript의 event.keyCode를 검색해서 살펴보아도 124에 해당하는 문자가 어떤 것인지 알아낼 수 없었다.

뭐, 중요한건 String.fromCharCode(cd)일테니, chrome의 개발자 모드에서 124에 해당하는 문자를 확인해 본다.

확인해보면, | 문자인걸 알 수 있다. 혹시나 싶어 문제 페이지에서 |를 입력하면 바로 password를 보여주는 페이지로 이동한다.

이 password를 문제목록 상단의 링크를 이용해 auth에 가서 넣어주면 점수를 획득할 수 있다.

'writeups > Web' 카테고리의 다른 글

webhacking.kr 018  (0) 2019.11.25
webhacking.kr 017  (0) 2019.11.25
type confusion  (0) 2019.11.25
webhacking.kr 006  (0) 2019.11.25
php? c?  (0) 2019.11.25

Description

Category: Web

Source: webhacking.kr

Points: 100

Author: Jisoon Park(js00n.park)

Description:

Write-up

문제 페이지를 보면 이게 뭐냐 싶다. 일단 소스 코드를 확인하자.

<?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> 

코드를 살펴보면, id와 pw에 base64 encode를 10번 하고, 1부터 8까지의 숫자들을 특수문자로 대체해서 cookie에 갖고 다니도록 구현되어 있다.

코드 하단에서는 그 연산을 반대로 다시 적용하여 id/pw를 체크한다.

변환 코드를 재활용해서 문제에서 요구하는 cookie에 저장될 적절한 값을 만들어보자.

<?php
//if(!$_COOKIE[user]) 
{ 
    $val_id="admin"; 
    $val_pw="admin"; 

    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("ID : $val_id<br>PW : $val_pw<hr>");

    echo("<meta http-equiv=refresh content=0>"); 
}

?>

위 코드를 실행시켜보면, 아래와 같은 결과를 얻을 수 있다. (id와 pw는 동일한 값이다.)

얻어낸 값을 cookie에 실어 보내면 flag를 얻을 수 있(을 것이)다.

예전에 풀어놨던거라 flag가 뭔지 모르겠다...(미안)

'writeups > Web' 카테고리의 다른 글

webhacking.kr 017  (0) 2019.11.25
webhacking.kr 016  (0) 2019.11.25
type confusion  (0) 2019.11.25
php? c?  (0) 2019.11.25
QR CODE PUZZLE  (0) 2019.11.25

Description

Category: Web

Source: wargame.kr

Points: 292

Author: Jisoon Park(js00n.park)

Description:

Simple Compare Challenge.

hint? you can see the title of this challenge.

:D

Write-up

하나의 입력창이 주어진다. Javascript 코드를 따라가 보면, util.js 파일의 submit() 함수를 통해 입력값이 json 형태로 서버로 전송되는 것을 확인할 수 있다.

function submit(key){
  $.ajax({
    type : "POST",
    async : false,
    url : "./index.php",
    data : {json:JSON.stringify({key: key})},
    dataType : 'json'
  }).done(function(result){
    if (result['code'] == true) {
      document.write("Congratulations! flag is " + result['flag']);
    } else {
      alert("nope...");
    }
    lock = false;
  });
}

서버에서는 sha1으로 생성한 key와 내가 전송한 key가 동일한지 비교하게 되는데, sha1() 함수의 반환값은 높은 확률로 문자열일 것으로 기대할 수 있다.

<?php
 if (isset($_GET['view-source'])) {
     show_source(__FILE__);
    exit();
 }
 if (isset($_POST['json'])) {
     usleep(500000);
     require("../lib.php"); // include for auth_code function.
    $json = json_decode($_POST['json']);
    $key = gen_key();
    if ($json->key == $key) {
        $ret = ["code" => true, "flag" => auth_code("type confusion")];
    } else {
        $ret = ["code" => false];
    }
    die(json_encode($ret));
 }

 function gen_key(){
     $key = uniqid("welcome to wargame.kr!_", true);
    $key = sha1($key);
     return $key;
 }
?>

문제 이름부터 type confusion이므로, php에서 문자열과 비교했을 때 true가 되는 것들을 찾아보면, true 또는 0임을 알 수 있다.

burp suite를 이용해서 POST로 전송되는 json의 key 값을 0으로 수정하였더니 flag를 얻을 수 있었다.

Flag : 5cd960e58d2b53bb5a955167af559dacc578ec3b

'writeups > Web' 카테고리의 다른 글

webhacking.kr 016  (0) 2019.11.25
webhacking.kr 006  (0) 2019.11.25
php? c?  (0) 2019.11.25
QR CODE PUZZLE  (0) 2019.11.25
login with crypto! but..  (0) 2019.11.25

Description

Category: Web

Source: wargame.kr

Points: 116

Author: Jisoon Park(js00n.park)

Description:

javascript puzzle challenge

just enjoy!

Write-up

문제 페이지에 들어가보면, QR 코드 이미지를 6x6으로 분할한 조각 퍼즐이 나온다.

아무 생각 없이 퍼즐을 풀다가, 이렇게 푸는게 아니라는 생각이 들었다.

먼저, 페이지 소스 코드를 확인해 본다.

<center>
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js'></script>
<script type="text/javascript" src="jquery.jqpuzzle.js"></script>
<script type='text/javascript' src='jquery.color-RGBa-patch.js'></script>
<script type='text/javascript' src='jquery.blockUI.js'></script>
<script type="text/javascript">
/*<![CDATA[*/
 $(function(){ $('#join_img').attr('src',unescape('.%2f%69%6d%67%2f%71%72%2e%70%6e%67'));
  $('#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>
<style>
#join_img {padding:15px 15px 0 15px; border:2px solid #999; background-color:#444;}
</style>
<br />
<h1>QR Code Puzzle</h1>
<br />
<img id="join_img" /><br />

마지막에 보면 join_img를 보여주는데, javascript에 보면 뭔가 의심스러운 url 인코딩 된 문자열이 보인다.

url decode해보면, "./img/qr.png"라는 경로가 보이는데, 이걸 따라 "http://wargame.kr:8080/qr_code_puzzle/img/qr.png" 페이지로 가보면 원본 qr 코드 이미지를 확인할 수 있다.

원본 qr 코드 이미지를 찾았으니, 대충 아무 온라인 qr decoder를 이용하여 decoding을 수행해본다.

decoding 된 qr 코드는 하나의 URL을 던져주는데, 이 URL로 접속해보면 flag를 얻을 수 있다.

Flag : 59c4ea27083762adab514956704844c720dc4508

'writeups > Web' 카테고리의 다른 글

webhacking.kr 006  (0) 2019.11.25
type confusion  (0) 2019.11.25
php? c?  (0) 2019.11.25
login with crypto! but..  (0) 2019.11.25
md5_compare  (0) 2019.11.25

Description

Category: Web

Source: wargame.kr

Points: 297

Author: Jisoon Park(js00n.park)

Description:

do you know "integer type" of 32bit application?

Write-up

두 종류의 입력을 받는 텍스트 박스가 있다. 소스 코드를 보면 첫번째 인자가 p7 바이너리의 입력으로 주어지고, 두번째 인자가 바이너리의 실행 결과와 동일해야 한다고 한다.

<?php
 if (isset($_GET['view-source'])) {
     show_source(__FILE__);
    exit();
 }
 require("../lib.php"); // include for auth_code function.
 if(isset($_POST['d1']) && isset($_POST['d2'])){
  $input1=(int)$_POST['d1'];
  $input2=(int)$_POST['d2'];
  if(!is_file("/tmp/p7")){exec("gcc -o /tmp/p7 ./p7.c");}
  $result=exec("/tmp/p7 ".$input1);
  if($result!=1 && $result==$input2){echo auth_code("php? c?");}else{echo "try again!";}
 }else{echo ":p";}
?>

p7 바이너리는 주어지지 않는데, 코드를 살펴보면 소스 코드인 p7.c 파일이 현재 디렉토리에 존재하는 것을 알 수 있다. 주소 표시줄에 p7.c를 넣어 소스 코드를 확인해 보자.

#include <stdio.h>
#include <stdlib.h>
void nono();
int main(int argc,char **argv){
 int i;
 if(argc!=2){nono();}
 i=atoi(argv[1]);
 if(i<0){nono();}
 i=i+5;
 if(i>4){nono();}
 if(i<5){printf("%d",i);}
 return 0;
}
void nono(){
  printf("%d",1);
  exit(1);
}

입력으로 받은 값이 음수이면 안되고, 거기에 5를 더했을 때 5보다 작아지면 될것 같다. 자연수에서야 이런 수는 없겠지만, c 코드에서는 integer overflow가 존재하니 그것을 이용하자.

integer overflow에 따르면, 32bit MAX_INT 값에 1을 더하면 MIN_INT가 된다. MAX_INT에 5를 더하면 MIN_INT + 4가 될것이다. 32bit MAX_INT와 MIN_INT의 값은 쉽게 알아낼 수 있다.

2147483647과 –2147483644를 d1과 d2에 각각 넣어주면 flag를 얻을 수 있다... 라고 생각했는데, 입력값 길이에 걸린다. 소스 코드로 봤을 때 서버쪽에서 특별한 길이 제한은 없었으니 burp suite로 request를 수정해 주면 된다.

이제 정상적으로 flag를 확인할 수 있다.

Flag : 9b6c4f386f3ebded4c3284103b5d73a397f6ae45

'writeups > Web' 카테고리의 다른 글

type confusion  (0) 2019.11.25
QR CODE PUZZLE  (0) 2019.11.25
login with crypto! but..  (0) 2019.11.25
md5_compare  (0) 2019.11.25
md5 password  (0) 2019.11.25

Description

Category: Web

Source: wargame.kr

Points: 216

Author: Jisoon Park(js00n.park)

Description:

md5('value', true);

Write-up

password를 찾는 문제이다. 주어진 소스를 먼저 분석해본다.

<?php
 if (isset($_GET['view-source'])) {
  show_source(__FILE__);
  exit();
 }

 if(isset($_POST['ps'])){
  sleep(1);
  mysql_connect("localhost","md5_password","md5_password_pz");
  mysql_select_db("md5_password");
  mysql_query("set names utf8");
  /*
  
  create table admin_password(
   password char(64) unique
  );
  
  */

  include "../lib.php"; // include for auth_code function.
  $key=auth_code("md5 password");
  $ps = mysql_real_escape_string($_POST['ps']);
  $row=@mysql_fetch_array(mysql_query("select * from admin_password where password='".md5($ps,true)."'"));
  if(isset($row[0])){
   echo "hello admin!"."<br />";
   echo "Password : ".$key;
  }else{
   echo "wrong..";
  }
 }
?>
<style>
 input[type=text] {width:200px;}
</style>
<br />
<br />
<form method="post" action="./index.php">
password : <input type="text" name="ps" /><input type="submit" value="login" />
</form>
<div><a href='?view-source'>get source</a></div>

전송한 password를 바로 사용하지 않고, md5한 값을 사용하도록 되어 있다.

문제 설명에도 나와있지만, php에서 md5(str, true) 처럼 두번째 인자로 true를 주는게 어떤 의미인가 싶어서 찾아봤더니 digest를 문자열로 주는게 아니라 binary로 돌려주는 옵션이었다.

md5를 적용했을 때 적당한 SQLi 공격 문자열이 생성되는 입력을 찾으면 될것 같다.

여러 입력을 생각해 볼 수 있는데, 일단은 일반적인 (문자열)'or'(문자열) 형태를 출력하는 입력을 만들어 보자.

google에 md5 sql injection으로 검색해보면, 129581926211651571912466741651878684928이란 값을 찾을 수 있다. 이 값을 md5 hash하여 raw byte를 출력해보면 ٔ0Do#ࠁ'or'8라는 문자열이 나온다.

'8'은 True로 해석되므로, 129581926211651571912466741651878684928를 입력하면 곧바로 문제를 해결할 수 있다.

또다른 방법은 =을 두번 사용하도록 하는 것이다. 예를 들어, sql query의 where 절에 password='abc'='def'라는 조건이 오면, password='abc' 부분은 false로, 'def'도 false로 해석되어 false=false가 되어 최종적으로는 true가 된다고 한다.

(참고로, mysql query에서, "1"은 True, "a"는 False이다.)

간단하게, '=' 라는 문자열이 포함된 hash를 만들어내는 입력을 찾아보자.

import md5

i = 0
while True:
  m = md5.new()
  m.update(str(i))
  if "'='" in m.digest():
    print str(i)
    break
  i = i + 1

1839431이라는 값을 금방 찾을 수 있고, 이를 입력하면 key를 얻을 수 있다.

Flag : 5e49a3fa8ec013bc0acc7393c1301ff87b749565

'writeups > Web' 카테고리의 다른 글

QR CODE PUZZLE  (0) 2019.11.25
php? c?  (0) 2019.11.25
md5_compare  (0) 2019.11.25
login with crypto! but..  (0) 2019.11.25
login filtering  (0) 2019.11.25

+ Recent posts