sbaa的ms03049修改版0.2 关于这个漏洞的描述 eEys写得很清楚了 只是开始我理解有些问题,其实溢出是在wkssvc.dll 里的某个api call vsprintf函数时, 对于w2k 用NetValidateName这个api发包,就可以让服务端调用到 这个api ,但call 这个api之前需要检查是否有写权限,所以ntfs分区不行 对于xp 多了一个扩展的api NetAddAlternateComputerName,用这个api 发包,服务端也会掉vsprintf,但和2k的位置是不一样的,这个地方不需要检测权限 所以没有ntfs的限制。
对于2k 很容易发生溢出 ,简单调试后0.1版出来了。 当时以为xp可以用NetAddAlternateComputerName attack 2k 其实2k服务端会检测 没有这个扩展api是不会调用的,所以不行。 对于xp 发现溢出需要加长buffer,而且buffer里在某些地方会被截断, 以为是unicode转成ascii了,所以忙了一天写wchar的shellcode,晚上试了发现还是不行 仔细看了原来是 vsprintf的format %ws 这个是打印双字节的,只要每个字符加上0x0就可以 不是做了unicode转换,也不要用 MultiByteToWideChar,因为这个是转unicode,和 %ws的转换 是不一样的。
对于2k和xp不同的是xp是靠vsprintf 写的 buf 去溢出的 而2k是靠原来的buffer在另一个地方溢出,我试了给长一点的buf,但在前面又会引发异常,不过 这些都在检测权限之后了,所以多研究也区别不大了。
程序我在cn 2k sp4,en2k sp4,cn xp sp1 上测试通过,因为是栈溢出,比较容易研究,如果哪个系统不能成功,自己改改地址吧 ps 我2k是jmp ebx 的,但xp 是jmp esp的 |