본문 바로가기
웹 해킹/드림핵

[Dreamhack] Carve Party

by L3m0n S0ju 2021. 4. 22.


 

문제에서 주어진 html 파일을 열면 위 그림과 같이 호박이 있고 호박을 클릭하면 아래에 카운터가 10000에서 1씩 줄어든다.

 

 


<script>

var pumpkin = [ 124, 112, 59, 73, 167, 100, 105, 75, 59, 23, 16, 181, 165, 104, 43, 49, 118, 71, 112, 169, 43, 53 ];

var counter = 0;

var pie = 1;

 

function make() {

  if (0 < counter && counter <= 1000) {

    $('#jack-nose').css('opacity', (counter) + '%');

  }

  else if (1000 < counter && counter <= 3000) {

    $('#jack-left').css('opacity', (counter - 1000) / 2 + '%');

  }

  else if (3000 < counter && counter <= 5000) {

    $('#jack-right').css('opacity', (counter - 3000) / 2 + '%');

  }

  else if (5000 < counter && counter <= 10000) {

    $('#jack-mouth').css('opacity', (counter - 5000) / 5 + '%');

  }

 

  if (10000 < counter) {

    $('#jack-target').addClass('tada');

    var ctx = document.querySelector("canvas").getContext("2d"),

    dashLen = 220, dashOffset = dashLen, speed = 20,

    txt = pumpkin.map(x=>String.fromCharCode(x)).join(''), x = 30, i = 0;

 

    ctx.font = "50px Comic Sans MS, cursive, TSCu_Comic, sans-serif";

    ctx.lineWidth = 5; ctx.lineJoin = "round"; ctx.globalAlpha = 2/3;

    ctx.strokeStyle = ctx.fillStyle = "#1f2f90";

 

    (function loop() {

      ctx.clearRect(x, 0, 60, 150);

      ctx.setLineDash([dashLen - dashOffset, dashOffset - speed]); // create a long dash mask

      dashOffset -= speed;                                         // reduce dash length

      ctx.strokeText(txt[i], x, 90);                               // stroke letter

 

      if (dashOffset > 0) requestAnimationFrame(loop);             // animate

      else {

        ctx.fillText(txt[i], x, 90);                               // fill final letter

        dashOffset = dashLen;                                      // prep next char

        x += ctx.measureText(txt[i++]).width + ctx.lineWidth * Math.random();

        ctx.setTransform(1, 0, 0, 1, 0, 3 * Math.random());        // random y-delta

        ctx.rotate(Math.random() * 0.005);                         // random rotation

        if (i < txt.length) requestAnimationFrame(loop);

      }

    })();

  }

  else {

    $('#clicks').text(10000 - counter);

  }

}

 

$(function() {

  $('#jack-target').click(function () {

    counter += 1;

    if (counter <= 10000 && counter % 100 == 0) {

      for (var i = 0; i < pumpkin.length; i++) {

        pumpkin[i] ^= pie;

        pie = ((pie ^ 0xff) + (i * 10)) & 0xff;

      }

    }

    make();

  });

});

</script>


위 코드는 html 파일에서 자바스크립트 부분만 가져온 것이다. 해당 코드에서 몇 가지 핵심 코드를 추출하겠다.

 

 

var pumpkin = [ 124, 112, 59, 73, 167, 100, 105, 75, 59, 23, 16, 181, 165, 104, 43, 49, 118, 71, 112, 169, 43, 53 ];

 

다음 코드는 길이가 22인 배열을 생성하는 코드이다. 플래그의 길이와 비슷한 것으로 보아 플래그 값을 구하는데 필요할 것이다.

 

 

    if (counter <= 10000 && counter % 100 == 0) {

      for (var i = 0; i < pumpkin.length; i++) {

        pumpkin[i] ^= pie;

        pie = ((pie ^ 0xff) + (i * 10)) & 0xff;

      }

 

다음 코드는 카운터를 100으로 나누었을 때 나머지가 0이면 pumpkin 배열에 각 원소마다 암호화를 하는 코드이다. 암호의 키 값과 알고리즘을 알아냈으니 플래그를 얻을 수 있다.

 


#include <stdio.h>
#pragma warning(disable:4996)


int main(void)
{
    int pie = 1;
    char pumpkin[] = {124, 112, 59, 73, 167, 100, 105, 75, 59, 23, 16, 181, 165, 104, 43, 49, 118, 71, 112, 169, 43, 53};
    for (int j = 0; j < 100; j++)
    {
        for (int i = 0; i < sizeof(pumpkin); i++)
        {  
            pumpkin[i] ^= pie;
            pie = ((pie ^ 0xff) + (i * 10)) & 0xff;
        }
    }
    for (int k = 0; k < sizeof(pumpkin); k++)
    {
        printf("%c", pumpkin[k]);
    }
}

 


 

위 코드는 익스플로잇 코드이다. pumpkin 배열에 초기 값들을 넣고 알고리즘을 100번 돌려서 플래그를 출력한다.

 

 

 


 

플래그

 

 

'웹 해킹 > 드림핵' 카테고리의 다른 글

[Dreamhack] csrf-1  (0) 2021.07.15
[Dreamhack] xss-1  (0) 2021.07.15
[Dreamhack] web-misconf-1  (0) 2021.03.29
[Dreamhack] command-injection-1  (0) 2021.03.29
[Dreamhack] image-storage  (0) 2021.03.29

댓글