Pull to refresh

Perl write-only vs. JS write-only

Reading time1 min
Views1.7K
Этот небольшой JavaScript Йосуке Хасегава выполняет alert(1):
(É=[Å=[],µ=!Å+Å][µ[È=-~-~++Å]+({}+Å) [Ç=!!Å+µ,ª=Ç[Å]+Ç[+!Å],Å]+ª])() [µ[Å]+µ[Å+Å]+Ç[È]+ª](Å)

Как это работает?


Для простоты заменим
Å -> Int_1
É -> f_sort
È -> Int_3
µ -> B_false
ª -> Str_rt
Ç -> Str_truefalse

Получим:
(f_sort=[Int_1=[],B_false=!Int_1+Int_1][B_false[Int_3=-~-~++Int_1]+({}+Int_1) [Str_truefalse=!!Int_1+B_false,Str_rt=Str_truefalse[Int_1]+Str_truefalse[+!Int_1],Int_1]+Str_rt])() [B_false[Int_1]+B_false[Int_1+Int_1]+Str_truefalse[Int_3]+Str_rt](Int_1)

Отформатируем:
  1.  
  2. (f_sort=
  3.       [
  4.           Int_1 = [],
  5.           B_false = !Int_1 + Int_1 // B_false = ![]+[] = false
  6.       ] // [[],false]
  7.           [    
  8.           B_false[
  9.               Int_3 = -~-~ ++Int_1 // ++Int_3 = 3 ([].toInt() -> 0, ++0 = 1, ~1 -> -2, --2 -> 2, ~2->-3, --3 = 3), Int_1 = 1
  10.           ] // 'false'[3] = 's'
  11.           + ({} + Int_1 ) // {} cast to string  -> '[object Object]' + 1 -> '[object Object]1'
  12.                   [
  13.                       Str_truefalse = !!Int_1 + B_false, //  !!Int_1 -> true, Str_truefalse = true + false = 'truefalse'
  14.                     Str_rt = Str_truefalse[Int_1] + Str_truefalse[+!Int_1],  // Str_rt = 'truefalse'[1] + 'truefalse'[0] =  'rt'
  15.                       Int_1 // 1
  16.                 ]//'[object Object]1'['truefalse', 'rt',1] -> 'o' ('[object Object]1'[1])
  17.           + Str_rt
  18.  
  19.           ]// [][ 's'+'o'+'rt'] -> [].sort
  20. )() //  (f_sort = [].sort)() -> [].sort.call() -> window
  21. [
  22.       B_false[Int_1]+ // 'false'[1] -> 'a'
  23.       B_false[Int_1+Int_1]+ // 'false'[2] -> 'l'
  24.       Str_truefalse[Int_3]+ // 'truefalse'[3] -> 'e'
  25.       Str_rt // 'rt'
  26. ] // ['alert']
  27.       (Int_1) // window['alert'](1)
  28.  


Все просто и понятно.
Tags:
Hubs:
Total votes 86: ↑68 and ↓18+50
Comments38

Articles