News for hackers. Stuff that matters.
Re:JSFuck (2012) by city41 on Saturday September 25, 2021 @09:41PM (#28657665)
Here's the decoder ring: https://github.com/aemkei/jsfuck/blob/master/jsfuck.js

With this I was able to get the letter 'a' by starting with their initial definition `(false+"")[1]`, then continually substituting

(false+'')[1]

(![]+'')[1]

(![]+([]+[]))[1]

(![]+([]+[]))[+!(+[])]

All of the above lines when evaluated result in 'a'.

Re:JSFuck (2012) by hn_throwaway_99 on Saturday September 25, 2021 @10:03PM (#28657777)
Yep, in addition the other part that helped me understand was how it encodes eval for actually executing code. Details are on this line, https://github.com/aemkei/jsfuck/blob/1f02651e98da1c13aef76d... , and details of that are:

1. [] => An array object

2. []["flat"] => The built in flat function on the Array object

3. []["flat"]["constructor"] => The constructor of any JS function is the Function constructor, which can take JavaScript, as a string, as its sole parameter. Thus, to create a function that executes any CODE_AS_STRING:

4. []["flat"]["constructor"](CODE_AS_STRING) => gives you the Function object, and finally:

5. []["flat"]["constructor"](CODE_AS_STRING)() => executes it

Thus, all that's left is to encode the strings "flat", "constructor" and CODE_AS_STRING using the patterns described early in that file.