はまやんはまやんはまやん

hamayanhamayan's blog

Java Script Kiddie 2 [picoCTF 2019 Web 450]

https://ctftime.org/task/9501

前提知識

  • javascript読解
  • バイナリに対する導入知識

解説

javascriptが変わっているが原理は同じなので読み直す

function assemble_png(u_in){
    var LEN = 16;
    var key = "00000000000000000000000000000000"; // 32桁になってる
    var shifter;
    if(u_in.length == key.length){ // 入力は32桁
        key = u_in;
    }
    var result = [];
    for(var i = 0; i < LEN; i++){
        shifter = Number(key.slice((i*2),(i*2)+1)); // 飛び飛びで見てるだけだった
        for(var j = 0; j < (bytes.length / LEN); j ++){
            result[(j * LEN) + i] = bytes[(((j + shifter) * LEN) % bytes.length) + i]
        }
    }
    while(result[result.length-1] == 0){
        result = result.slice(0,result.length-1);
    }
    document.getElementById("Area").src = "data:image/png;base64," + btoa(String.fromCharCode.apply(null, new Uint8Array(result)));
    return false;
}

よくよく見るとさっきの問題と変わらない。
候補を探すとこんな感じ。

 0 | 8 14
 1 | 8
 2 | 2
 3 | 9
 4 | 2
 5 | 4
 6 | 2 6
 7 | 4
 8 | 7
 9 | 3 4
10 | 3 4
11 | 4 6
13 | 4
14 | 8
15 | 6

全探索できるレベルなので、全部試す。
80802090204020407030306000408060が答え。
他の解法と違ったやつだけど、定期的に変わってるんだろうか。