【发布时间】:2020-10-11 09:53:47
【问题描述】:
我正在阅读一篇关于 2000 年代格式字符串漏洞利用的旧文章,链接可以在这里找到:Article
在第 15 页,作者描述了通过增加 printf 内部堆栈指针来覆盖变量内容的方法:Stack pushed
unsigned char canary[5];
unsigned char foo[4];
memset (foo, ’\x00’, sizeof (foo));
/* 0 * before */ strcpy (canary, "AAAA");
/* 1 */ printf ("%16u%n", 7350, (int *) &foo[0]);
/* 2 */ printf ("%32u%n", 7350, (int *) &foo[1]);
/* 3 */ printf ("%64u%n", 7350, (int *) &foo[2]);
/* 4 */ printf ("%128u%n", 7350, (int *) &foo[3]);
/* 5 * after */ printf ("%02x%02x%02x%02x\n", foo[0], foo[1],
foo[2], foo[3]);
printf ("canary: %02x%02x%02x%02x\n", canary[0],
canary[1], canary[2], canary[3]);
返回输出“10204080”和“canary:00000041”
不幸的是,作者没有解释为什么会这样压栈,换句话说,printf 过程的哪一部分引发了内存中的覆盖?
编辑: 我明白 /1/ 中的指令将创建一个宽度为 16 的右填充字段,然后将写入的字节数 (16) 写入 foo[0] 的地址。 问题是为什么它会覆盖到相邻的内存?您通常会认为它只会写入 foo[0] 的地址,它是一个字节而不是 4。
【问题讨论】:
-
请参阅规范和您对“%n”部分的理解,以阐明您的问题所在。
标签: c format-string