Login
Immutable PageDiscussionInfoAttachments
CTF/Writeup/SECCON 2014 Quals Online Winter/jspuzzle

MMA

jspuzzle (Web 100pts)

次のように空欄に番号を付ける。

({<1> :function(){ 
  this[<2> ] = (new Function( <3> + <4> + <5> ))(); 
  var pattern = <6>; 
  var r = new RegExp( pattern ); 
  this[ r[ <7> ]( pattern ) ][ <8> ]( 1 ); 
}})[ <9>[ <10> ]() ]();

次のような順序で考えた。

  1. <1><9>[<10>]()は等しくないと中の関数は呼び出されない。このような組み合わせは<1>:"function", <9>:"Function", <10>:"toLowerCase" しかないので、この3つは確定する。

  2. r[<7>](pattern)]<2>と等しいと嬉しい。regexpに対する関数呼び出しなので<7>はおそらくexec。この時、<6>が通常の文字列だとr.exec(pattern)が配列になってしまう。そのため、<6>は自分自身にマッチしない‘"^[\w]$"‘となる。

  3. この時、r[”exec"](pattern)]はnullになるため、<2>"null"で確定する。

  4. <3> <4> <5>について、何かを返却するので、<3>"return"で確定。その後に空白が必要なので、<4>"/*^_^*/"になる。

  5. <8>でalertが呼び出されるようにするために、<5>"this"にして、<8>"alert"にする。これによって最終的に、this.alert(1)となる。

CTF/Writeup/SECCON 2014 Quals Online Winter/jspuzzle (last edited 2014-12-07 21:05:58 by nomeaning)