Это не вызов, а вопрос, я решил, что это было по теме из-за
Вопросы, не связанные с заданиями, связанные с решением головоломок по программированию или с определенным типом задач, также обсуждаются.
Теперь к вопросу:
Можно ли написать какой-либо код JavaScript всего с 5 буквами? JSFuck уже делает это с 6 символами, !+[]()
но мне интересно, !
нужен ли персонаж.
JSFuck работает с комбинацией приведения к строке (путем добавления пустого массива), приведения к числу (путем написания + перед) и приведения к логическому значению путем отрицания. Например:
[] \\ Empty array
+[] \\ Cast to number -> 0
!+[] \\ Negate -> true
!+[]+[] \\ Cast to string -> "true"
Из этой строки мы можем извлечь все ее буквы, используя квадратные скобки с числом внутри, и любое число можно сделать, сложив true много раз.
Таким образом, можно найти много букв, которые можно объединить в строки. Самая важная строка, которую можно создать, заключается в том, "constructor"
что ее можно использовать для получения Function
любой функции, а этот объект можно использовать для выполнения строк в виде JavaScript:
[]["find"] \\ the function Array.prototype.find
[]["find"]["constructor"] \\ the Function object
[]["find"]["constructor"](string)() \\ same as eval(string)
Как вы можете видеть, !
имеет 2 использования здесь:
- Создание чисел для выбора букв из строк.
- Кастинг на логическое значение, чтобы получить
"true"
и"false"
.
Первый из этих 2 также можно сделать с помощью ++
инкремента, а не непосредственно 0
, но он может быть использован для элементов внутри массива:
+[] \\ 0
[+[]] \\ [0]
[+[]][+[]] \\ [0][0] -> 0
++[+[]][+[]] \\ ++[0][0]-> 1
++[[]][+[]] \\ also works because ++ casts to number
Таким образом, все номера могут быть созданы без !
.
Второй сложнее. Важность "true"
и "false"
лежит в письмах "r"
и "s"
, которые оба появляются в "constructor"
. Я уже нашел все остальные буквы "constructor"
с помощью "undefined"
, "Infinity"
, "NaN"
и литьем функции строк.
Итак, главный вопрос: (Как) вы можете создавать булевы или буквы "r"
и "s"
в JavaScript, используя только +[]()
?
Письмо "l"
может также помочь. Его можно получить из формы, null
но я не смог получить это значение с этими 5 символами. Например, он может быть использован для получения логических значений, если у нас уже есть "s"
:
[]["includes"]() \\ false
[+[]]["includes"](+[]) \\ true
Письмо "l"
и "k"
вместе даст доступ к "r"
:
([]+[])["link"]() \\ "<a href="undefined"></a>"
Любой способ получить логическое значение null
или любую из букв r s l k
будет очень полезным!
Библиотека того что имеем:
Array.prototype.find: [] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] Бесконечность: + ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + (+ + [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ []) + (+ []) + (+ [])) NaN: + [] [[]] undefined: [] [[]] 0: + [] 1: ++ [[]] [+ []] 2: (++ [[]] [+ []]) + (++ [[]] [+ []]) 3: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) 4: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) 5: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) 6: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) 7: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) 8: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) 9: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) a: (+ [] [[]] + []) [++ [[]] [+ []]] c: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] d: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])] e: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []])] f: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []]) + (++ [[]] [+ []])] i: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] n: ([] [[]] + []) [++ [[]] [+ []]] o: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] t: (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ [] ])] u: ([] [[]] + []) [+ []] v: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]))] y: (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ [] ]) + (++ [[]] [+ []])] I: (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [+ []] N: (+ [] [[]] + []) [+ []] "": ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (+ + [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [ ]) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ [] ] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (+ + [[]] [+ []]) + (++ [[]] [+ []])))] (: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))] ): ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))] {: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))] }: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ ((++ [[]] [+ [] ]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + [] + ((++ [[]] [+ []]) + ( ++ [[]] [+ []])))] .: (+ (++ [[]] [+ []] + [] + (++ [[]] [+ []]) + ([] [[]] + []) [(++ [ []] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + (++ [[]] [+ [] ] + [] + (+ []) + (+ []))) + []) [++ [[]] [+ []]] ,:[[]] [([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + ([] [(([] [[]] + []) [ (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []])]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[] ] + []) [++ [[]] [+ []]]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []] )] + ([] [[]] + []) [++ [[]] [+ []]] + ([] [(([] [[]] + []) [(++ [[ ]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) ]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [ + []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + (+ [] [[]] + []) [++ [[]] [+ []]] + (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + ( ++ [[]] [+ []] + []) + (+ []) + (+ []) + (+ [])) + []) [(++ [[]] [+ [] ]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[ ]] [+ []]) + (++ [[]] [+ []])]] ([[]]) + []
источник
eval
2453 символа сwindow
разрешенным.Ответы:
После мозгового штурма получается, что, по крайней мере, в современных браузерах это невозможно сделать.
Я постараюсь подвести итог всего процесса, добавив некоторые соображения о том, почему мы исчерпали наши возможности в любом конкретном домене, прежде чем двигаться дальше. Затем, за исключением какого-то удивительного нового понимания (например, углового случая синтаксиса JavaScript, о котором все забывают), будет совершенно ясно, что нет способа получить оставшиеся буквы.
литералы
Единственный непосредственные литералами вы можете сделать с
+()[]
являются вложенными пустыми массивами[]
,[[]]
,[[[]]]
и т.д. Оттуда, мы можем начать литье значения с помощью+
:+[]
получает ноль, который трюк Йенса расширяет до произвольных натуральных чисел, используя++
.[]+[]
есть""
. На самом деле,[]+x
получает нам строковое представлениеx
в целом.[]
Следующее использование индексации. Индексирование объекта вне границ ([][[]]
) поможет вамundefined
. Приведение этого к строке и индексация результата дает вам буквыd e f i n u
; приведение его к целому числу вначале с использованием+
getNaN
, из которогоa N
следуют буквы .Использование
++
трюка на любом нецелочисленном значении, которое было достигнуто до сих пор, даетNaN
или ошибку. Кроме того, ни один из объектов, которые мы можем создать, не вызывается (пока), поэтому()
это не помогает (за исключением группировки).Остальные трюки в нашем рукаве - это кастинг и индексация. Итак, вопрос в том, какие строки мы можем создать, используя символы,
0123456789adefinuN
которые либоЧисловые литералы
В качестве примера второго варианта, то мы можем сделать строку
"1e1000"
, а затем получитьInfinity
от+"1e1000"
и отливка , что обратно в строку получает нам письмоy
иI
.Также мы можем сделать
"11e100"
, приведение к числу и обратно к строке, чтобы получить"1.1e+101"
, из чего мы извлекаем.
и+
.Используя это
.
, в свою очередь, мы можем составить строку".0000001"
, привести ее к числу и обратно, чтобы получить"1e-7"
, выиграв нас-
.Это в основном все типы с плавающей запятой, которые вы получите: нет более интересных значений, кроме
Infinity
иNaN
, и больше нет символов, используемых в их обычных строковых представлениях, кроме-+.0123456789e
.свойства
Итак, у нас есть письма
-+.0123456789adefinuyIN
. Какие свойства мы можем достичь? Давайте спросим JavaScript.Единственное
[].find
, что Йенс уже нашел. Давайте приведем это к строке, пожнем все ее буквы и попробуем снова. Строковое представление немного отличается в разных браузерах. На Chrome и Edge,"function find() { [native code] }"
содержитсяacdefinotuv()[]{}
и пробел; наш полный алфавит сейчас+-.()[]{}0123456789INacdefinotuvy
. На Firefox есть больше пробелов и новых строк, но буквы одинаковы.Мы повторяем наш поиск:
String.prototype.concat
устарела: она делает именно то, что+
делает, что мы уже можем сделать. Итак, мы получилиArray.prototype.concat
иArray.prototype.find
. Что мы можем с ними сделать?функции
concat()
позволяет нам создавать более длинные массивы.[[]].concat([[]])
есть[[], []]
, и приведение к строке получает нас","
. (Это не помогает нам находить новые свойства.) Но.concat
не изменяет наши значения, и оно никогда не сможет вернутьnull
или что-то в этом роде.Звонок
find()
нам тоже не поможет: документация MDN гласит:Оба из них мы уже можем сделать с помощью индексации.
И отсюда больше некуда идти. Если вы сомневаетесь в том, что я написал, дайте мне знать в комментариях.
источник
null
функции , возвращающие:String.prototype.match
,RegExp.exec
, иArray.prototype.includes
. Обнаружив, что все это невозможно сформировать, если нет странного способа сформировать регулярное выражение, о котором я не знаю, я также пришел к выводу, что для этого нет никакого способа."catch"
и"throw"
, что в настоящее время не можем, нам нужно что-то,eval
например, использовать их в качестве ключевых слов, что является нашей главной целью.-
и приведения чисел, но это не очень полезно.3 функции в ответе Линн не были такими бесполезными. Но строгий режим в ECMAScript 5 сорвал мой план.
В старых версиях JavaScript / ECMAScript есть странность. Если метод вызывается без объекта,
window
предполагается глобальный объект . Итак, мы можем сделать это:Это все еще верно для современных браузеров, но только если функция не определена в строгом режиме. И все встроенные функции (с собственным кодом), казалось, были в строгом режиме. В старых браузерах, когда строгого режима еще нет, это также работает для встроенных функций.
Предположим, мы используем старые браузеры. Затем, если мы хотим
window
, мы должны найти встроенную функцию, которая возвращает что-то содержащееthis
. В нашем единственном выборе есть функция, котораяArray.prototype.concat
делает именно это. Мы можем проверить это так:Таким образом, в основном не имеет значения, является ли объект, к которому он вызывается, массивом (но, по крайней мере, он должен быть объектом). Он просто оборачивает его в массив, если нет.
Если бы мы имели
window
, во-первых, мы можем получить строку[object Window]
, приведя ее к строке. С новым персонажемb
мы можем получитьr
иs
использовать следующие две строки соответственно, и каждый символ, которого у нас не былоconstructor
:Но другая проблема заключается в удалении ссылки на объект
[].concat
. Упаковка в массив и извлечение не работает, потому что[].concat
уже означает[]["concat"]
. Единственный известный мне способ, который может быть сконструирован с использованием,+[]()
- это вернуть его из функции.Array.prototype.find
казалось, что смог сделать это:У нас всегда были правдивые функции.
Array.prototype.concat
иString.prototype.concat
оба возвращают истину, если объект естьwindow
. Если мы используем более позднюю версию, мы использовали все три доступные функции.Но, к сожалению,
Array.prototype.find
не существует в старом браузере, который мы используем. По крайней мере, я не нашел тот, который работает. И я не нашел другого способа удалить ссылку на объект.Полный код, который можно тестировать в современных браузерах, который возвращает
r
иs
, с.bind(window)
обходным путем:источник
find
пришло намного позже, чем строгий режим, поэтому найти что-то работающее вряд ли. Я спросил об Edge, потому что думал, что у него есть шанс отдать предпочтение обратной совместимости, а не следовать стандарту. Я также попробовал Konqueror по той же причине. И некоторые браузеры командной строки, но ни один из них даже не поддерживает JavaScript.find
не было реализовано, может быть, это было частично? ... Если бы только это было в их списке ...