]> git.somenet.org - pub/jan/ctf-seminar.git/blob - writeups/chrztoph/overTheWire2019/challenge1/challenge1.js
Add OTW Advent 2019 CTF writeup
[pub/jan/ctf-seminar.git] / writeups / chrztoph / overTheWire2019 / challenge1 / challenge1.js
1 var fs = require('fs');
2 const content = fs.readFileSync('sms4.csv', 'utf8');
3 const lines = content.split("\n");
4 const validLines = lines.filter(line => line.trim());
5
6 const keypadChars = {
7     0: " 0",
8     1: ".,'?!\"1-()@/:",
9     2: "abc2",
10     3: "def3",
11     4: "ghi4",
12     5: "jkl5",
13     6: "mno6",
14     7: "pqrs7",
15     8: "tuv8",
16     9: "wxyz9",
17     10: "@/:_;+&%*[]{}"
18 };
19
20 let lastInput = -1;
21 let lastTime = -1;
22 let sameInputCount = 0;
23 let result = "";
24 const NEW_KEY_TIMEDIFF_THRESHOLD = 1000;
25 const N7110_KEYPAD_ZERO = 0;
26 const N7110_KEYPAD_STAR = 10;
27 const N7110_KEYPAD_MENU_RIGHT = 101
28
29 for (let i = 0; i < validLines.length; i++) {
30     const splitted = validLines[i].split(",");
31     const time = Number.parseInt(splitted[0]);
32     const input = Number.parseInt(splitted[1]);
33
34     if (lastInput === input && time - lastTime < NEW_KEY_TIMEDIFF_THRESHOLD) {
35         sameInputCount++;
36     } else if (input === N7110_KEYPAD_MENU_RIGHT) {
37         result = result.substr(0, result.length - 1);
38
39         sameInputCount = 0;
40     } else {
41         if (lastInput >= N7110_KEYPAD_ZERO && lastInput <= N7110_KEYPAD_STAR) {
42             result += keypadChars[lastInput][sameInputCount % keypadChars[lastInput].length];
43         }
44
45         sameInputCount = 0;
46     }
47
48     lastInput = input;
49     lastTime = time;
50 }
51
52 console.log(result);