diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..b58b603 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/ctf10k-rpn.iml b/.idea/ctf10k-rpn.iml new file mode 100644 index 0000000..0c8867d --- /dev/null +++ b/.idea/ctf10k-rpn.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jsLibraryMappings.xml b/.idea/jsLibraryMappings.xml new file mode 100644 index 0000000..d23208f --- /dev/null +++ b/.idea/jsLibraryMappings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..5b812b6 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/main.js b/main.js new file mode 100644 index 0000000..eff6c17 --- /dev/null +++ b/main.js @@ -0,0 +1,59 @@ +const Net = require('net'); + +const port = 8002 +const host = "ctf10k.root-me.org" + +const client = new Net.Socket + +client.on('data', (data) => { + console.log("received data:\n", data.toString()) + + regex =/(?^\d+.*$)/m + let message = regex.exec(data.toString()).groups["equation"] + console.log("equation:", message) + + let response = interpretRPN(message) + console.log("response:", response) + let buf = Buffer.from(response+"\n") + client.write(buf) +}) + +client.on('end', () => { + console.log("connection terminated by remote host") +}) + +client.connect({port: port, host: host}, () => { + console.log("connected") +}) + +function interpretRPN(message){ + const operators = ['-', '+', 'x', '/'] + let elements = message.split(' ') + for (let i = 0; i < elements.length; i++) { + if (operators.includes(elements[i])) { + let operation = elements.slice(i-2, i+1) + let result = computeOperation(operation) + elements.splice(i-2, 3, result) + i = 0 + } + } + + return elements.toString() +} + +function computeOperation(operation) { + switch (operation[2]) { + case '-': + return BigInt(operation[0]) - BigInt(operation[1]) + case 'x': + return BigInt(operation[0]) * BigInt(operation[1]) + case '/': + return BigInt(operation[0]) / BigInt(operation[1]) + case '+': + return BigInt(operation[0]) + BigInt(operation[1]) + } +} + +// const example = "994 611 + 357 733 + 82 543 - x x 740 + 136 x 996 +" +// console.log("response:", interpretRPN(example)) + diff --git a/package.json b/package.json new file mode 100644 index 0000000..8cc61fe --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "name": "ctf10k-rpn", + "version": "1.0.0", + "dependencies": { + } +}