在printf()函数正常使用中,printf(s),printf("%s",s)都能够输出s字符串的值,但如果在s字符串中存在%,计算机无法判断是否为参数,所以可以在printf(s)中s填入带有%的符号,能达到泄漏地址的作用。
一般我们想要泄漏栈上多个地址,往往可以采用输出多个%x来达到。如果想直接获得某个地址,可以用%n$x。
#include <stdio.h>
int main() {
char s[100];
int a = 1, b = 0x22222222, c = -1;
scanf("%s", s);
printf("%08x.%08x.%08x.%s\n", a, b, c, s);
printf(s);
return 0;
}
可以用以上C代码来验证输入%08x.%08x.%08x,你会发现他在第二个printf中输出的是调用printf函数时调用栈上的部分地址
也可以输入AAAA%p%p%p%p%p%p%p%p%p%p%p%p%p%p%p,你会发现其中有一段为对应的414141,41为A的ASCII码
当然,能得到地址,当然也能覆盖地址,%n为将参数量赋值给当前地址,可以作为覆盖地址的渠道
#include <stdio.h>
int main(void)
{
int c = 0;
printf("%.100d%n", c,&c);
printf("\nthe value of c: %d\n", c);
return 0;
这个函数就成功的将c修改为100,所以只要能找到c的地址,再适当的使用%n植入对应的参数数量,就能将c地址覆盖为你想要地址
网友评论