simpleweb
ダウンロードしたファイルは次のようなjavascriptです。
var net = require('net');flag='fake_flag';var server = net.createServer(function(socket) {socket.on('data', (data) => {//m = data.toString().replace(/[\n\r]*$/, '');ok = true;arr = data.toString().split(' ');arr = arr.map(Number);if (arr.length != 5)ok = false;arr1 = arr.slice(0);arr1.sort();for (var i=0; i<4; i++)if (arr1[i+1] == arr1[i] || arr[i] < 0 || arr1[i+1] > 127)ok = false;arr2 = []for (var i=0; i<4; i++)arr2.push(arr1[i] + arr1[i+1]);val = 0;for (var i=0; i<4; i++)val = val * 0x100 + arr2[i];if (val != 0x23332333)ok = false;if (ok)socket.write(flag+'\n');elsesocket.write('nope\n');});//socket.write('Echo server\r\n');//socket.pipe(socket);});HOST = '0.0.0.0'PORT = 23333server.listen(PORT, HOST);
処理の内容は、入力された5つの数値を昇順に並べて、1番目の数値と2番目の数値の和、2番目と3番目の数値の和、3番目と4番目の数値の和、4番目と5番目の数値の和をとり、4つの数値を得ます。その4つの数値を順に0x100を掛けながら加算していきます。その結果を0x23332333と比較して一致すればフラグを得られるというものです。
したがって、和を取った後の4つの数値が0x23(35)、0x33(51)、0x23(35)、0x33(51)であれば良いのですが、入力した数値を昇順に並べ替えて処理していますので、そう単純ではありません。
したがって、和を取った後の4つの数値が0x23(35)、0x33(51)、0x23(35)、0x33(51)であれば良いのですが、入力した数値を昇順に並べ替えて処理していますので、そう単純ではありません。
並べ替えは文字列として処理されるので、次のように数値を入力することで、フラグを得ることができます。
$ nc 47.75.4.252 2333315 20 31 4 47*ctf{web_chal_made_by_binary_players_lol}
フラグは、
*ctf{web_chal_made_by_binary_players_lol}