gpt4 book ai didi

javascript - 使用 JSFuck 约定访问 RegExp

转载 作者:行者123 更新时间:2023-12-01 15:41:53 34 4
gpt4 key购买 nike

我想替换字符串中的一些字符,例如

console.log( 
"truefalse".replace("e","E")
)

但使用 jsfuck只允许 6 个字符的约定: []()!+ ,为了提高可读性,这里也允许使用带有字母 a-z 和 A-Z 以及数字 0-9 的 JS 字符串(因为很容易将这些字符串转换为 6 字符的 jsf 代码)。所以我可以这样写

console.log(
"truefalse"["replace"]("e","E")
)

但在上面的代码中,我使用了禁止字符 - 逗号: , .所以我使用 trincot here 发现的 2 个(和更多)参数调用函数的技术如下

console.log(
"truefalse"["split"]()["concat"]([["e"]["concat"]("E")])
["reduce"](""["replace"]["apply"]["bind"](""["replace"]))
)

现在我想在替换函数中使用正则表达式并使用上述限制编写代码

console.log(
"truefalse"["replace"](/e/g,"E")
)

但我不知道如何处理正则表达式部分 /e/g ?.不使用任何类型的“eval”(字符串被解释为代码)就可以做到这一点?

最佳答案

我看不到访问 RegExp 的方法没有评估代码的构造函数,例如 Function构造函数:

""["replace"]["constructor"]("return RegExp")()
但考虑到这一点
  • 如果需要替换多个匹配项,可以使用 replaceAll带有字符串作为第一个参数的方法
  • 方法matchmatchAll可以与字符串参数和 RegExp 一起使用将为该字符串即时创建对象,就好像您调用了 .match(RegExp(str))

  • 因此,例如,如果您需要将字符串拆分为四个字符的 block ,您可以使用 .matchAll("....") .只有两件事要做更多:
  • matchAll返回一个迭代器,您需要从中创建一个数组;喜欢 Array.from .
  • 因为您无法直接访问 Array变量,您可以使用 [].constructor反而。
  • 返回的 block 在嵌套数组中,需要展平。您可以链接 .flat()呼吁。

  • 这样就变成了

    console.log(
    []["constructor"]["from"]("abcdefghijkl"["matchAll"]("...."))["flat"]()
    );

    关于javascript - 使用 JSFuck 约定访问 RegExp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63605144/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com