完成本文,使用了两个工具
1. strace
2. google code search .
----
static struct swap_header_v1 {
char bootbits[1024]; /* Space for disklabel etc. */
unsigned int version;
unsigned int last_page;
unsigned int nr_badpages;
unsigned int padding[125];
unsigned int badpages[1];
} *p;
p->badpages[badpages] = page; // page为坏块号
这里需要注意的是,在 swap_header_v1的定义中,p->badpages数组大小为1,这里实际上产生了越界。但是,从C语言的知识我们知道,即使越界,只 要编译器没有检测出来,并且实际访问的“越界区”是我们可访问的区域,则不会有任何问题。上面这句代码是一种“可控的、有意识的越界”。可控的边界在哪里 呢?
#define MAX_BADPAGES ((pagesize-1024-128*sizeof(int)-10)/sizeof(int)) // 637 bad pages over i386结合swap_header_v1的定义,上面的公式不难理解 bootbits占1024字节,随后4个变量分别占4、4、4、4*125字节,SIGNATURE占10字节,剩余的都给badpages了。超过了 MAX_BADPAGES,则会引发越界访问。
write_signature((version == 0) ? "SWAP-SPACE" : "SWAPSPACE2");
offset = ((version == 0) ? 0 : 1024);对于v0,signature页被写到设备头,对于 v1,signature页被写到偏移为1024字节处。
if (lseek(DEV, offset, SEEK_SET) != offset)
error_msg_and_die("unable to rewind swap-device");
if (write(DEV, (char *) signature_page + offset, pagesize - offset)
!= pagesize - offset)
error_msg_and_die("unable to write signature page");
附mkswap源码
---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
Ray的生活博客: http://raywill.blog.sohu.com
---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----