본문 바로가기
Dreamhack/web

[Dreamhack] Carve Party Write up

by burdock129 2024. 10. 8.
반응형

이 문제는 web 문제지만 접속 정보가 없고 문제 파일은 html밖에 없습니다.

들어가보니 호박을 클릭해서 잭오랜턴을 만들라고 합니다. 그리고 밑에 10000번을 클릭하라고 되어있습니다.

 

오토마우스를 사용해서 1만번을 클릭할 수 있지만 만약 100만번이나 그러면 코드를 짜서 풀어야겠죠

그래서 전 코드를 짜서 풀어보겠습니다.

대부분의 코딩처럼 vscode나 온라인컴파일러에서 하는게 아닌 개발자 모드에 들어가서 console에서 실행시켜주면 됩니다.

코드를 보면 #jack-target이라는 것을 클릭하였을 때 counter가 1씩 증가하며 pumpkin배열의 값을 가져와서

pie와 xor 처리를 합니다. 그 후 10000번을 클릭하였을 때 flag가 나오게 됩니다.

 

#jack-target이라는 것을 클릭하면 되기 때문에

for(i=0; i<=10000; i++){
 $('#jack-target').trigger("click")
}

 

이 코드를 console에서 실행시켜주면 됩니다.

 

이렇게 flag가 나오는 것을 확인 할 수 있습니다.

 

flag: DH{I_lik3_pumpk1n_pi3}

 


 

다른 방법으로 풀어보면

 

 

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();
  });
});

이게 js 코드인데 여기 function() 함수에서 10000번 클릭해야 flag가 나오는데 100번에 1번 xor을 진행하기 때문에

100번 pie랑 pumpkin 배열과 xor을 해주게 됩니다.  

 

그래서 pumpkin과 pie가 100번 xor하게 코드를 짜주면 됩니다.

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

for i in range(100):
    for j, val in enumerate(pumpkin):
        pumpkin[j] ^= pie
        pie = ((pie ^ 0xff) + (j * 10)) & 0xff

print("".join(map(chr, pumpkin)))

 

flag: DH{I_lik3_pumpk1n_pi3}

반응형

'Dreamhack > web' 카테고리의 다른 글

[Dreamhack] xss-1 Write up  (0) 2024.10.08
[Dreamhack] cookie Write up  (0) 2024.10.08